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 (?, ?) ...