我想我并不是真的理解双向的一对多关系。
我有一个父类,一个子A类和一个子B类,父类<->子-A <->子-B之间具有双向关系。我想要将子项B添加到子项A的子项B列表中,但是每次尝试合并父项时,我都会得到一个Dubliced键异常。那么我如何添加一个新的子项-B呢?
class Parent {
long id;
@One-To-Many, MappedBy Parent, Cascade All, OrphanRemoval true
list <child-A> childsA;
...
setter + getter
}和
class Child-A {
long id;
@Many-To-One, JoinColums parentId, Cascade PERSIT MERGE REFRESH
Parent parent;
@One-To-Many, MappedBy Child-A, Cascade All, OrphanRemoval true
list <child-B> childsB;
...
setter + getter
}和
class Child-B {
long id;
@Many-To-One, JoinColums Child-A-id, Cascade PERSIT MERGE REFRESH
Child-A child-A;
...
setter + getter
}如何将新的子代B添加到子代A中,并合并父代以保存数据库中的所有内容?到目前为止,我已经尝试过:
Parent p = entityManager.getParent();
Child-A ca = p.getChildsA.get(indexOfCa); // the index is known
Child-B cb = new Child-B ();
... // fill cb with information
ca.add(cb); // automatically fires cb.setChild-A(ca);
p.getChildsA.set(index, ca);
entityManager.merge(p);但这会导致DublicatedKeyException。那么,将子B对象添加到父对象中已持久化的子A对象的最佳实践是什么?
我还必须说,只有merge是可能的(没有保存、saveOrUpdate或持久化),并且不可能编辑实体类。实体是由工厂之类的东西生成的,在构建项目时,每个更改都将被覆盖。并且pom-file是不可编辑的。这也是一个Java EE web应用程序,有很多不同的框架,比如primefaces和omnifaces。
发布于 2020-04-29 20:49:58
我自己解决的。mysql数据库上自动生成的主键的限制为low。因此jpa耗尽了主键并尝试覆盖现有键。增加了hibernate_sequence编号,异常就消失了。
https://stackoverflow.com/questions/61491862
复制相似问题