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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Jpa 级联持久化新实体时主键冲突_Jpa_Jpa 2.0_Openjpa - Fatal编程技术网

Jpa 级联持久化新实体时主键冲突

Jpa 级联持久化新实体时主键冲突,jpa,jpa-2.0,openjpa,Jpa,Jpa 2.0,Openjpa,我的问题的简化版本是:我有三个实体(注释也简化): 我有个例外 Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.C(ID)"; SQL statement: INSERT INTO PUBLIC.C (ID, SOMEPROPERTY) VALUES (?, ?) ... 在SQL日志中,我可以看到OpenJPA(我正在使用的提供程序)两次尝试将id为31的行插入表C。但是,我希望c1和c2对象被视为相等的,并且只插

我的问题的简化版本是:我有三个实体(注释也简化):

我有个例外

Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.C(ID)"; SQL statement: 
INSERT INTO PUBLIC.C (ID, SOMEPROPERTY) VALUES (?, ?) ...

在SQL日志中,我可以看到OpenJPA(我正在使用的提供程序)两次尝试将id为31的行插入表C。但是,我希望c1和c2对象被视为相等的,并且只插入一行。我如何才能做到这一点?

尝试向所有实体添加@Version列。我不希望修改数据库架构。回头看,添加一个Version列是可行的。对不起,我不确定你最好的赌注是什么。如果我希望您的em.merge(…)调用导致EntityExistsException或其他什么的话。
A a = new A;
a.setId(1);

Collection<B> bs = new ArrayList<B>();
B b1 = new B();
b1.setId(21);
Collection<C> cs1 = new ArrayList<C>();
C c1 = new C();
c1.setId(31);
c1.setOtherProperty(null);
cs1.add(c1);
b1.setCs(cs1);

B b2 = new B();
b2.setId(22);
Collection<C> cs2 = new ArrayList<C>();
C c2 = new C();
c2.setId(31); // notice this is the same id as c1
c2.setOtherProperty(null);
cs2.add(c2);
b2.setCs(cs2);

bs.add(b1);
bs.add(b2);
a.setBs(bs);
entityManager.merge(a);
Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.C(ID)"; SQL statement: 
INSERT INTO PUBLIC.C (ID, SOMEPROPERTY) VALUES (?, ?) ...