调用entityManager.remove()时,Hibernate是否删除引用的实体?
我有以下(简化的)问题: 我有一个多对一关系的实体:调用entityManager.remove()时,Hibernate是否删除引用的实体?,hibernate,jpa,annotations,Hibernate,Jpa,Annotations,我有以下(简化的)问题: 我有一个多对一关系的实体: @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 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;
}
}
然后我就这样坚持下去:
mem1.setUser(user1);
user1.getMemberships().add(mem1);
entityManager.getTransaction().begin();
entityManager.persist(user1);
entityManager.persist(mem1);
entityManager.getTransaction().commit();
现在我想删除会员资格。因此,我呼吁:
entityManager.remove(mem1);
。。。回想一下,我已经在User
侧设置了cascade=CascadeType。删除和cascade=CascadeType。在Membership
侧设置了所有。但是引用的成员身份mem1
不会自动从user1
中删除,也就是说,user1.getMemberships()
仍保留mem1
!这是正确的行为吗?从数据库中删除实体时,JPA是否从不自动从对象中删除引用
这似乎是一个愚蠢的问题,但我是JPA的初学者,有时很难看出注释会为您带来什么样的魔力,因为有时会有很多效果。级联删除操作将使Hibernate调用entityManager.remove()
(或实体集合)。因此,引用的实体将从数据库中删除。但它使实体实例保持不变
请注意,在多工单上使用cascade=REMOVE(或ALL)通常是一个非常糟糕的主意。如果只删除某个用户的一个成员身份,则通常不希望删除该用户。好吧,是的,在这种情况下效果不太好。由于关联实体可能已分离或未分离,为了确保删除它们,您可以执行以下两种操作之一:
- 如果使用JPA2,请添加删除选项:
@OneToMany(mappedBy=“whatever”,orphan=true)
- 如果使用JPA1,则必须手动删除它们