JPA2.0& Hibernate:使用父实体合并删除子表行(从父项的子实体集中删除条目)

时间:2013-03-20 14:31:46

标签: hibernate jpa-2.0

我正在使用JPA2.O和Hibernate。我在用户和地址之间有一对多的关系,我有以下关系配置:

cascade = CascadeType.ALL, fetch = FetchType.LAZY,

例如,我在数据库表中有以下条目:

用户表

Column: UserID | UserName
row1:    User1 | UserName

地址表

Column: AddressId| UserID | Address    

row1:   Address1 | User1  | Actual Address

row2:   Address2 | User1  | Actual Address

我可以使用find by userId获取用户实体:

User user = entityManager.find(User.class, userId);

还可以使用user.getAddresses()获取Answers。 getAddressess()的代码如下所示:

public class User{
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
    public Set<Address> getAddresses() {
       return this.addresses;
    }
}

现在我要做的是,我正在获取地址集并删除一个条目。假设我第一次获取addressess set我有地址1和2.我从地址集中删除了地址2实体。现在,用户实体指向的Set只有1个用于Address1的条目。

现在如果我使用下面的方法合并用户实体,我认为应该从地址表中删除地址2的行。但它没有发生。我错过了任何东西,或者它不是一种方法。请建议。

entityManager.merge(user); 

1 个答案:

答案 0 :(得分:2)

我希望在我开始工作时添加更多细节。

我在 @OneToMany 关系中添加了 orphanRemoval = true

public class User{
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "user")
    public Set<Address> getAddresses() {
       return this.addresses;
    }
}

更改我的代码后,我重新测试了它并得到了以下错误:

Caused by: org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance:

This link帮我解决了上述问题:

现在我可以从数据库中删除子实体,如果它们与父实体中的已定义集合断开连接(删除)。