2012-04-25 172 views
0

我的实体是: 设备的ID是deiveID 与 这是摆脱JPA主键冲突

我的测试库的ID许多一对多的关系代码是: 两个新的设备实体想设置相同的新公理

问题是: 如果我使用相同的entitymanager来坚持这2个新的设备实体,它会没事的。 但如果我使用2个不同的entitymanager实例来坚持他们,错误“主键违规”将出来。我认为企业家第二次试图坚持自由,这已经是第一次。

-------------- deviceinfo entity ------------------------------ ------------------

@Entity 
@Table(name="deviceInfo") 
public class DeviceInfoEntity extends BaseEntity implements Serializable{ 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private long deviceId; 
.... 
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY) 
@JoinTable(name = "device_lib", joinColumns = @JoinColumn(name = "deviceInfo_id", 
    referencedColumnName="deviceId"), 
    inverseJoinColumns = @JoinColumn(name = "lib_id", referencedColumnName="rId")) 
private List<LibEntity> resourceList = null; 
...... 
} 

------------------------- lib entity ---------------------------------------------

@Entity 
    @Table(name="lib") 
    public class LibEntity extends BaseEntity implements Serializable{ 
      @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private long rId; 

      @ManyToMany(mappedBy = "resourceList", cascade=CascadeType.ALL, 
        fetch=FetchType.LAZY, targetEntity=DeviceInfoEntity.class) 
     private List<DeviceInfoEntity> deviceInfolist = null; 

      ..... 
    } 

我的测试代码:

EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("testPU"); 
      EntityManager em = emFactory.createEntityManager(); 


    LibEntity libEntity = new LibEntity(); 


    DeviceInfoEntity dEntity = new DeviceInfoEntity(); 
    dEntity.setName("dadadada"); 
    dEntity.setLibEntity(libEntity); 


    DeviceInfoEntity dEntity2 = new DeviceInfoEntity(); 
    dEntity2.setName("dadadadadddddd"); 
    dEntity2.setLibEntity(libEntity); 


    em.getTransaction().begin(); 
    em.persist(dEntity); 
    em.getTransaction().commit(); 

    em.close(); 

    EntityManager em2 = emFactory.createEntityManager(); 
    em2.getTransaction().begin(); 
    em2.persist(dEntity2); 
    em2.getTransaction().commit(); 

它就会有个错误:

Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.LIB(RID)"; SQL statement: 
INSERT INTO lib (RID) VALUES (?) [23505-165] 

但是,如果我使用相同的EntityManager错误不会发生。有没有人知道最新的原因?是由cascade=CascadeType.ALL造成的?

+0

[JPA cascade persist和对分离实体的引用引发PersistentObjectException的可能重复。为什么?](http://stackoverflow.com/questions/4294671/jpa-cascade-persist-and-references-to-detached-entities-throws-persistentobjecte) – axtavt 2012-04-25 07:06:14

回答

2

通过将分离的对象分配给托管对象,正在破坏持久性上下文。被管理对象应该只引用其他管理对象。

对于dEntity2你应该设置libEntity到一个查找的结果(),getReference()或合并()libEntity的。

dEntity2.setLibEntity(em2.find(libEntity.getClass(), libEntity.getId()); 

你也许还呼吁合并(),而不是持续的(),它应该可以解决脱离的对象。

+0

感谢您的帮助〜 – Xiwen 2012-04-25 16:15:43