У меня следующая (упрощенная) проблема:
У меня есть сущность в отношениях «многие к одному»:
@Entity
public class Membership {
private User user;
@ManyToOne(cascade = CascadeType.ALL)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
... и следующий соответствующий класс на стороне «один ко многим»:
@Entity
public class User extends Person {
private Set<Membership> memberships = new HashSet<Membership>();
@OneToMany(mappedBy = "user", cascade = { CascadeType.MERGE,
CascadeType.REMOVE, CascadeType.REFRESH })
public Set<Membership> getMemberships() {
return memberships;
}
public void setMemberships(Set<Membership> memberships) {
this.memberships = memberships;
}
}
Я создал пользователя с именем user1
и членство mem1
через new
и связал его так:
mem1.setUser(user1);
user1.getMemberships().add(mem1);
тогда я сохраняю их так:
entityManager.getTransaction().begin();
entityManager.persist(user1);
entityManager.persist(mem1);
entityManager.getTransaction().commit();
Теперь я хочу удалить членство. Поэтому я звоню:
entityManager.remove(mem1);
... напомним, что я установил cascade=CascadeType.REMOVE
на стороне User
и cascade=CascadeType.ALL
на стороне Membership
. Но указанное членство mem1
не удаляется из user1
автоматически, то есть user1.getMemberships()
все еще удерживает mem1
! Это правильное поведение? JPA никогда не удаляет ссылки автоматически из объектов при удалении сущностей из базы данных?
Это может показаться глупым вопросом, но я новичок в JPA, и иногда трудно точно понять, какую магию аннотации будут выполнять для вас, потому что иногда это довольно много.