JPA向父级的子级添加新的子级,导致密钥被复制

问题描述 投票:0回答:1

我想我不太了解双向的一对多关系。

我有一个父级,一个子级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。

jpa one-to-many bidirectional java-ee-8
1个回答
0
投票

由我自己解决。 mysql数据库上自动生成的主键的限制,该限制要低到哪里。因此,jpa用尽了主键,并尝试覆盖现有键。增加了hibernate_sequence数量,但异常消失了。

© www.soinside.com 2019 - 2024. All rights reserved.