【问题标题】:JPA add new child to child of parent causes dublicated keyJPA将新孩子添加到父母的孩子导致重复键
【发布时间】:2020-04-28 23:47:22
【问题描述】:

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

我有一个父母,一个孩子-A和孩子-B类,父母孩子-A 孩子-B之间有双向关系。我想将一个子 B 添加到子 A 的子 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。那么,将子 B 对象从父对象添加到已经持久化的子 A 对象的最佳做法是什么?

我还不得不说,只有合并是可能的(不能保存、保存或更新或持久化)并且不能编辑实体类。实体由工厂之类的东西生成,并且在构建项目时,每个更改都将被覆盖。并且 pom 文件不可编辑。 这也是一个 Java EE Web 应用程序,具有许多不同的框架,例如 primefaces 和 omnifaces。

【问题讨论】:

    标签: jpa one-to-many bidirectional java-ee-8


    【解决方案1】:

    自己解决了。 mysql 数据库上自动生成的主键的限制在哪里低。所以 jpa 用完了主键并试图覆盖现有的键。增加了 hibernate_sequence 数量并且异常消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多