4

我相信这是一种常见的情况。假设我在休眠中有一个一对多映射: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控制顺序而不是直接混淆。ItemsItems

但是,您确实只想更新Category自己的情况呢?先加载并合并?

4

1 回答 1

1

对于您的问题,如果我们从高级别查看而不进入代码,我发现问题不在于休眠配置,而在于您如何处理实体。我建议您通过以下方式修改处理实体的方式,

1)您没有提到在将 Category 对象传递给 UI 之前如何获取它。因此,如果您使用 get load 方法简单地获取类别对象,那么您可以简单地创建单独的初始化方法,该方法可以通过简单地调用 getter 方法来加载项目集合。通过 getter 方法延迟加载的项目集合将被填充,然后您可以将其传递给 UI。用户只需修改类别,以便项目保持原样。然后,您可以保存该实体,因此项目将保持原样。

2) 如果您不想在传递给 UI 之前加载项目集合,那么您可以只获取类别对象而不加载项目集合。将其传递给 UI。一旦用户修改并传回它,而不是直接保存它,我建议您首先获取该 category_id 的最新类别对象并通过调用 getter 加载其项目,然后将更改后的值从 UI 返回的类别填充到这个最新获取的类别中。现在您可以保存这个合并的对象,以便您的项目集合是安全的。

于 2012-10-22T11:47:42.107 回答