我想我不太了解双向的一对多关系。
我有一个父级,一个子级A和一个子级B,在父级子级A 子级B之间具有双向关系。我想将子B添加到子A的子B列表中,但是在每次尝试合并父B时,我都会得到一个双重的键异常。因此,我如何添加一个新的子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。那么,从父对象向已经持久的子A对象添加子B对象的最佳实践是什么?
我也不得不说,仅合并是可能的(无保存,saveOrUpdate或持久性),并且不可能编辑实体类。实体是由工厂等生成的,在构建项目时,所有更改都会被覆盖。而且pom文件不可编辑。同样,这是一个Java EE Web应用程序,具有许多不同的框架,例如primeface和omnifaces。
由我自己解决。 mysql数据库上自动生成的主键的限制,该限制要低到哪里。因此,jpa用尽了主键,并尝试覆盖现有键。增加了hibernate_sequence数量,但异常消失了。