Я думаю, что я неправильно понял значение каскадирования в контексте @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
я полагаю)?
источник
Смотрите здесь пример из документации OpenJPA.
CascadeType.ALL
означает, что он будет делать все действия.Quote:
Себастьян
источник
Как я объяснил в этой статье и в моей книге, High-Performance Java Persistence , вы не должны использовать
CascadeType.ALL
на@ManyToOne
так сущность переходов состояний должна распространяться от родительских организаций к ребенку те, а не наоборот.@ManyToOne
Сторона всегда Младенец ассоциация , поскольку она отображает основной столбец внешнего ключа.Таким образом, вы должны переместить
CascadeType.ALL
из@ManyToOne
ассоциации на@OneToMany
сторону, которая должна также использоватьmappedBy
атрибут , так как это наиболее эффективное отображение таблицы отношения один-ко-многим .источник
Из спецификации EJB3.0 :
Таким образом, вкратце, отношения сущностей, определенные с помощью
CascadeType.All
, гарантируют, что все события постоянства, такие как persist, refresh, merge и remove, которые происходят в родительском объекте, будут переданы дочернему элементу. Определение другихCascadeType
параметров предоставляет разработчику более детальный уровень контроля над тем, как ассоциация сущностей обрабатывает постоянство.Например, если у меня есть объект Book, который содержит список страниц, и я добавляю объект страницы в этот список. Если
@OneToMany
аннотация, определяющая связь между Книгой и Страницей, помечена какCascadeType.All
, сохранение Книги приведет к тому, что Страница также будет сохранена в базе данных.источник
В JPA 2.0, если вы хотите удалить адрес, если вы удалили его из сущности пользователя, вы можете добавить
orphanRemoval=true
(вместоCascadeType.REMOVE
) в свой@OneToMany
.Больше объяснения между
orphanRemoval=true
иCascadeType.REMOVE
находится здесь .источник
Если вы просто хотите удалить адрес, назначенный пользователю, и не влиять на класс сущности User, попробуйте что-то вроде этого:
Таким образом, вам не нужно беспокоиться об использовании fetch в аннотациях. Но помните, что при удалении пользователя вы также удаляете подключенный адрес к объекту пользователя.
источник