JPA @ManyToOne с CascadeType.ВСЕ


Я думаю, что я неправильно понял смысл каскадные в контексте @ManyToOne отношения.

корпус:

public class User {

   @OneToMany(fetch = FetchType.EAGER)
   protected Set<Address> userAddresses;

}

public class Address {

   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   protected User addressOwner;

}

в чем смысл cascade = CascadeType.ALL? Например, если я удаляю определенный адрес из базы данных, как влияет тот факт, что я добавил cascade = CascadeType.ALL влияет на мои данные (User, Я думаю)?

5 145

5 ответов:

смысл CascadeType.ALL Это то, что персистентность будет распространяться (каскад) все EntityManager операции (PERSIST, REMOVE, REFRESH, MERGE, DETACH) к связанным сущностям.

кажется, в вашем случае, чтобы быть плохой идеей, как удаление Address приведет к удалению соответствующих User. Поскольку у пользователя может быть несколько адресов, другие адреса станут сиротами. Однако обратный случай (аннотирование User) имеет смысл - если адрес принадлежит только одному пользователю, безопасно распространять удаление всех адресов, принадлежащих Пользователю, если этот пользователь удален.

кстати: вы можете добавить mappedBy="addressOwner" атрибут User чтобы сообщить поставщику сохраняемости, что столбец соединения должен быть в адресной таблице.

посмотреть здесь для примера из документов OpenJPA. CascadeType.ALL означает, что он будет делать все действия.

цитата:

CascadeType.PERSIST: при сохранении сущности также сохраняются сущности, содержащиеся в этом поле. Мы предлагаем либеральное применение этого правила каскада, потому что если EntityManager находит поле, которое ссылается на новую сущность во время flush, и поле не использует CascadeType.Упорствуйте, это ошибка.

CascadeType.Удалить: при удалении объекта также удалите объекты, содержащиеся в этом поле.

CascadeType.Обновить: при обновлении сущности также обновите сущности, содержащиеся в этом поле.

CascadeType.Слияние: при слиянии состояния сущности также объедините сущности, содержащиеся в этом поле.

Себастьян

из спецификации EJB3.0:

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

если X является управляемым объектом, операция удаления приводит к тому, что он становится удаленный. Операция удаления каскадируется на объекты, на которые ссылается X, если отношения от X к этим другим сущностям аннотируется с помощью каскад=удалить или каскад=все значение элемента аннотации.

Итак, в двух словах, отношения сущностей, определенные с CascadeType.All гарантирует, что все события сохраняемости, такие как persist, refresh, merge и remove, которые происходят на родительском устройстве, будут переданы дочернему устройству. Определение других CascadeType options предоставляет разработчику более детальный уровень контроля над тем, как ассоциация сущностей обрабатывает сохраняемость.

например, если бы у меня был объектная книга, содержащая список страниц, и я добавляю объект страницы в этот список. Если @OneToMany аннотация, определяющая связь между книгой и страницей, помечается как CascadeType.All, сохранение книги приведет к тому, что страница также будет сохранена в базе данных.

как я объяснил в в этой статье и в моей книге, Высокая Производительность Java Persistence, вы никогда не должны использовать CascadeType.ALL on @ManyToOne С сущность состояния должен распространяться от родительских объектов к дочерним.

The @ManyToOne сторона всегда является дочерней ассоциацией, так как она должна отображать базовый FK.

, перемещение CascadeType.ALL с

в JPA 2.0 Если вы хотите удалить адрес, если вы удалили его из объекта пользователя, вы можете добавить orphanRemoval=true (вместо CascadeType.REMOVE) к @OneToMany.

больше объяснений между orphanRemoval=true и CascadeType.REMOVE и здесь.