0

私のエンティティは次のとおりです。deiveIDであるデバイスのIDは、rIDであるLibのIDと多対多の関係にあります。

私のテストコードは次のとおりです。2つの新しいデバイスエンティティが同じ新しい自由度を設定したい

問題は次のとおりです。同じentitymanagerを使用してその2つの新しいデバイスエンティティを永続化する場合、問題はありません。しかし、2つの異なるentitymanagerインスタンスを使用してそれらを永続化すると、「主キー違反」というエラーが発生します。エンティティマネージャーは、2回目に自由を持続させようとしていると思います。これは、最初にすでに持続されています。

--------------deviceinfoエンティティ---------------------------------- --------------

@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
    @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

4

1 に答える 1

3

デタッチされたオブジェクトを管理対象オブジェクトに割り当てることにより、永続コンテキストが破損しています。管理対象オブジェクトは、他の管理対象オブジェクトのみを参照する必要があります。

dEntity2の場合、libEntityをlibEntityのfind()、getReference()、またはmerge()の結果に設定する必要があります。

すなわち

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

おそらく、persist()の代わりにmerge()を呼び出すこともでき、分離されたオブジェクトを解決する必要があります。

于 2012-04-25T13:39:59.057 に答える