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 ответов:
смысл
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.Слияние: при слиянии состояния сущности также объедините сущности, содержащиеся в этом поле.
Себастьян
использование элемента каскадной аннотации может использоваться для распространения влияние операции на связанные объекты. Каскад функциональные возможности чаще всего используются в отношениях родитель-потомок.
если 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
и здесь.