Недавно я разрабатывал базовый проект и наткнулся на сценарий. Допустим, у меня есть School
со списком User
с, которые могут иметь новый или существующий адрес, как показано ниже:
@Table("school") @Entity
class School {
@OneToMany(cascade=CascadeType.ALL, mappedBy="school")
private List<User> students;
}
@Table("user") @Entity
class User {
@ManyToOne
@JoinColumn(...)
private School school;
@ManyToOne(cascade=?)
@JoinColumn(...)
private Address address;
}
@Table("address") @Entity
class Address { ... } // No bi-directional relationship
Всякий раз, когда я пытаюсь упорствовать, я получаю выходные данные:
Если School
имеет только User
s с новым адресом, а тип каскада установлен на ALL
или PERSIST
, сохранение нового экземпляра School
работает как положено.
Если School
имеет только User
с существующим адресом и опущен каскадный тип, он работает, как и ожидалось, при сохранении нового School
.
При сохранении нового экземпляра School
, содержащего User
s, с новым и существующим адресом и CascadeType, установленным в ALL
, следующее исключение выдается org.hibernate.PersistentObjectException: detached entity passed to persist
. (Я так понимаю, что список сохранил адрес)
При сохранении экземпляра School
со смешанными User
с новым и существующим адресом, но без установленного каскадного типа, выдается временное исключение, как и ожидалось.
Интересно, есть ли решение, кроме сохранения каждого адреса пользователя перед сохранением School
объекта.