Как я понимаю ключевое слово CascadeType? - PullRequest
0 голосов
/ 25 декабря 2018

Я думал, что ключевое слово CascadeType связано с операцией EntityManager.
Но эти коды меня смущают.
Код вроде следующего. (Извините за действительно простой код)

Parent parent = new Parent();
Child child1 = new Child();
Child child2 = new Child();

parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);

после запуска был вставлен parent, child1, child2.
Пока все в порядке, и я ожидаю этого.

Parent foundParent = em.merge(parent); // parent has identifier
Child child1 = new Child();
Child child2 = new Child();

parent.addChild(child1);
parent.addChild(child2);

Отсюда .. Я начал думать em.perist != CascadeType.PERSIST.

И .. этот код также был таким же.

Parent foundParent = em.find(Parent.class, 1);
Child child1 = new Child();
Child child2 = new Child();

parent.addChild(child1);
parent.addChild(child2);

child1, child2 также был вставлен.

Теперь я очень растерялся.
Если они не совпадают между operation of EntityManager и CascadeType, как я могу понять CascadeType.MERGE?

Извините за мой короткий английский, спасибо за чтение.

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Persist и merge предназначены для сохранения одного управляемого экземпляра определенного объекта.

Если вы используете persist, это означает, что объект еще не существует, поэтому сделать его уникальным управляемым экземпляромhurt.

Когда вы используете объединение, вы учитываете, что управляемый экземпляр объекта может уже существовать.Вы не хотите заменять этот уникальный управляемый экземпляр, потому что какой-то другой объект может ссылаться на него, полагая, что это управляемый объект.

Если вы используете merge в устаревшей версии объекта, которую вы передали в качестве аргументак предыдущему слиянию JPA не знает, как найти нужный объект, поскольку у него еще нет идентификатора.Предполагается, что это новый объект, и будет создан новый управляемый экземпляр.

  • CascadeType.PERSIST : presist каскадного типа означает, что каскад операций save () или persist ()к связанным объектам.
  • CascadeType.MERGE : объединение каскадного типа означает, что связанные объекты объединяются при объединении объекта-владельца.
  • CascadeType.REFRESH : обновление каскадного типа делает то же самое для операции refresh ().
  • CascadeType.REMOVE : удаление каскадного типа удаляет все связанные с ним объекты, связанные с этим параметром, при удалении объекта-владельца.
  • CascadeType.DETACH : отсоединение каскадного типа отсоединяет все связанные объекты, если происходит «ручное отсоединение».
  • CascadeType.ALL : все каскадный типявляется сокращением для всех вышеперечисленных каскадных операций.
0 голосов
/ 25 декабря 2018

В целом вы правы, но спецификации (JPA 2.2, параграф 3.2.4) также содержат следующие правила:

Семантика операции сброса, примененная к сущности X, такова:следует:

  • Если X является управляемым объектом, он синхронизируется с базой данных.
  • Для всех объектов Y, на которые ссылается связь из X, если связь с Y была аннотированасо значением элемента cascade cascade = PERSIST или cascade = ALL, операция persist применяется к Y.

Таким образом, если дочерний элемент добавляется к управляемому родительскому элементу, а parent-childСущность аннотируется с помощью cascade = PERSIST, затем вставляется дочерний элемент.

Спецификации находятся в свободном доступе.Это то, что определяет поведение.Поэтому, читая их, вы понимаете, как работает JPA.

...