JPA добавляет нового потомка к потомку родительских причин дублированного ключа - PullRequest
0 голосов
/ 29 апреля 2020

Наверное, я не совсем понимаю двунаправленные отношения один-ко-многим.

У меня есть родитель, класс child-A и child-B с двунаправленными отношениями между Parent <-> Child-A <-> Ребенок-B. Я хочу добавить child-B в child-B-list of child-A, но при каждой попытке объединить родителя я получаю исключение дублированного ключа. Так как мне добавить нового потомка-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 в child-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. Итак, что является лучшим способом добавить объект child-B в уже сохраненный дочерний объект A из родительского объекта?

Я также должен сказать, что возможно только слияние (без сохранения, saveOrUpdate или сохраняются) и невозможно редактировать классы сущностей. Сущности генерируются чем-то вроде фабрики, и каждое изменение будет перезаписываться при создании проекта. И pom-файл не редактируется. Также это веб-приложение Java EE с множеством различных фреймворков, таких как простые и омнифасы.

1 Ответ

0 голосов
/ 29 апреля 2020

Решил сам. Предел для автоматически сгенерированных первичных ключей в базе данных mysql где низкий. Таким образом, в jpa закончились первичные ключи, и он попытался переопределить существующие ключи. Увеличен номер hibernate_sequence и исключение пропало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...