我正在使用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);
答案 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帮我解决了上述问题:
现在我可以从数据库中删除子实体,如果它们与父实体中的已定义集合断开连接(删除)。