我相信这是一个常见的场景。假设我在 hibernate 中有一个一对多的映射:Category
有很多Items
类别:
@OneToMany(
cascade = {CascadeType.ALL},fetch = FetchType.LAZY)
@JoinColumn(name="category_id")
@Cascade(
value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN
)
private List<Item> items;
元素:
@ManyToOne(targetEntity=Category.class,fetch=FetchType.EAGER)
@JoinColumn(name="category_id",insertable=false,updatable=false)
private Category category;
一切正常。我用
Category
完全控制Item
的生命周期。但是,当我编写代码来更新时 Category
, 首先我得到 Category
从数据库出来。然后将其传递给 UI。用户为 Category
填写更改的值并传回去。问题来了:因为我只传递Category
信息,而不是 Items
, Items
因此集合将为空。当我打电话时saveOrUpdate
,它将清除所有关联。关于什么是最好的解决这个问题的任何建议?我认为拥有
Category
的优势控制Items
是轻松掌握Items
的顺序并且不要直接混淆。但是如果您确实只想更新
Category
的情况呢?本身?先加载然后合并?
最佳答案
对于您的问题,如果我们在没有深入代码的情况下从高层查看,我认为问题不在于 hibernate 配置,而在于您处理实体的方式。我建议您通过以下方式修改处理实体的方式,
1) 在将 Category 对象传递给 UI 之前,您没有提到如何获取它。因此,如果您使用 get load 方法简单地获取类别对象,那么您可以简单地创建单独的初始化方法,该方法可以通过简单地调用 getter 方法来加载项目集合。通过 getter 方法延迟加载的项目集合将被填充,然后您可以将其传递给 UI。用户只需修改类别,项目将保持原样。然后您可以保存该实体,因此项目将保持原样。
2) 如果您不想在传递到 UI 之前加载项目集合,那么您可以在不加载项目集合的情况下获取类别对象。将其传递给 UI。一旦用户修改并传回它,而不是直接保存它,我建议您首先获取该 category_id 的最新类别对象并通过调用 getter 加载其项目,然后将更改后的值从 UI 返回的类别填充到这个最新获取的类别中。现在您可以保存此合并对象,以便您的项目集合是安全的。
关于hibernate - 一对多 hibernate 的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2870995/