【问题标题】:JPA2.0 & Hibernate: Removing Child table rows with Parent entity merge (On removing entries from parent's child entity set)JPA2.0 & Hibernate:使用父实体合并删除子表行(从父子实体集中删除条目)
【发布时间】:2013-03-09 17:14:12
【问题描述】:

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

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

我可以通过 userId 使用 find 来获取用户实体:

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

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

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

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

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

entityManager.merge(user); 

【问题讨论】:

  • 1) 建议改成@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user", orphanRemoval = true) 2) 请提供更多的第一种和第二种情况的代码
  • 谢谢迈克尔。这对我有用。我也从stackoverflow.com/questions/4329577/…得到了一个很好的描述。

标签: hibernate jpa-2.0


【解决方案1】:

只是想在我开始工作时添加更多细节。

我添加了 orphanRemoval = true@OneToMany 关系:

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帮我解决了以上问题:

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

【讨论】:

  • 提供的链接已损坏
  • 非常感谢。 orphanRemoval = true,解决了我的问题。我还使用了“fetch = FetchType.EAGER”。我在其他问题中看到程序员建议删除'fetch = FetchType.EAGER'。但对我来说,它奏效了。如果我删除“fetch = FetchType.EAGER”,那么我的更新将失败。我将父实体配置为:@OneToMany(mappedBy = "objWatchList", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
  • 很高兴听到它对您有用。享受编码!
猜你喜欢
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多