TEntity t = dao.load(TEntity.class,id);
 t.getDetails().clear();
 EntityDetail d = new EntityDetail();// 显然此时d的id=0;
 t.addDetail(d);
 EntityManager.merge(t);//执行此行代码后d的id>0;但问题是此时生成的id号有时会与d对应的数据库表T_Enity_D已存在的id号相同,导致事务提交时报'违反唯一约束条件';
 想不明白为什么会生成一样id号?
请各位赐教..

解决方案 »

  1.   

    把日志调成 DEBUG,把 JPA 执行的 SQL 设置成输出如果按以上两点做的话,我相信你很快就能找到答案。
      

  2.   

    t.getDetails().clear();
    后面加上session.flush
    因为虽然你将t的details清空了,但是并没有更新到数据库,flush之后就不会出现主键冲突。
      

  3.   


    这两点具体怎么做啊? 
    我的JPA用EclipseLink实现,在persistence.xml 哪个属性可以设为打印SQL?
    日志调成DEBUG 又怎么设置? 大哥请教...谢谢.. 
      

  4.   

    <property name="eclipselink.logging.level" value="FINE"/>
      

  5.   


    [EL Fine]: 2012-03-05 18:43:34.358--ClientSession(7557391)--Connection(13545476)--Thread(Thread[http-9080-3,5,main])--INSERT INTO T_Enity (ID, STATE, VERSION, MODIFYID) VALUES (?, ?, ?, ?)
    bind => [25145, EFFECT, 2, 325]
    [EL Fine]: 2012-03-05 18:43:34.377--ClientSession(7557391)--Connection(13545476)--Thread(Thread[http-9080-3,5,main])--INSERT INTO T_Enity_D (ID, STATE, VERSION, MANAGERID, ENTITYID) VALUES (?, ?, ?, ?, ?)
    bind => [69887, EFFECT, 1, 38411, 25145]
    [EL Warning]: 2012-03-05 18:43:34.384--UnitOfWork(7982270)--Thread(Thread[http-9080-3,5,main])--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DatabaseException
    Internal Exception: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 违反唯一约束条件 (PETER.SYS_C0046817)T_Enity_D表中 已存在69887的ID号..
    为什么生成相同的ID?为什么?
      

  6.   

    TEntity 类的代码贴出来看看
      

  7.   


    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    public long getId() {
    return id;
    } public void setId(long id) {
    this.id = id;
    }这是所有类的ID生成策略.使用oracle11g
      

  8.   

    问题已解决.
    原因是自己用户数据是从其它用户的数据导入进来的.
    自己用户sequence序列值比较小.其它用户的数据量已大大超过自己的sequence的currval
    所以在增加记录时难免主键冲突.
    删除自己用户的sequence,用回其它用户的sequence就可以了.