Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 持久化多对多列时发生jpa主键冲突_Java_Jpa_Eclipselink - Fatal编程技术网

Java 持久化多对多列时发生jpa主键冲突

Java 持久化多对多列时发生jpa主键冲突,java,jpa,eclipselink,Java,Jpa,Eclipselink,我的实体是: 已定义的设备的ID 有多对多的关系 为rID的Lib的ID 我的测试代码是: 两个新设备实体想要设置相同的新设备实体 问题是: 如果我使用同一个entitymanager来持久化这两个新的设备实体,就可以了。 但是如果我使用两个不同的entitymanager实例来持久化它们,就会出现“主键冲突”错误。我认为entitymanger试图在第二次保存libentity,这在第一次保存时就已经存在了 --------------deviceinfo实体-----------------

我的实体是: 已定义的设备的ID 有多对多的关系 为rID的Lib的ID

我的测试代码是: 两个新设备实体想要设置相同的新设备实体

问题是: 如果我使用同一个entitymanager来持久化这两个新的设备实体,就可以了。 但是如果我使用两个不同的entitymanager实例来持久化它们,就会出现“主键冲突”错误。我认为entitymanger试图在第二次保存libentity,这在第一次保存时就已经存在了

--------------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;
......
}
    @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;

           .....
    }
它将出现以下错误:

 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

将分离的对象分配给托管对象造成的吗。托管对象应仅引用其他托管对象

对于dEntity2,应该将libEntity设置为libEntity的find()、getReference()或merge()的结果

i、 e


您也可以调用merge()而不是persist(),它应该解析分离的对象。

将分离的对象分配给托管对象会破坏持久性上下文。托管对象应仅引用其他托管对象

对于dEntity2,应该将libEntity设置为libEntity的find()、getReference()或merge()的结果

i、 e

您可能还可以调用merge()而不是persist(),它应该解析分离的对象。

可能重复的可能重复的
 Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.LIB(RID)"; SQL statement:
 INSERT INTO lib (RID) VALUES (?) [23505-165]
dEntity2.setLibEntity(em2.find(libEntity.getClass(), libEntity.getId());