调用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,则必须手动删除它们