我认为这是一种常见的情况。假设我在休眠中有一对多的映射: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
时,首先我从DB中获取Category
。然后将其传递给UI。用户填写Category
的更改值并传回。问题出现了:因为我只传递Category
信息,而不是Items
,因此Items
集合将为空。当我打电话给saveOrUpdate
时,它会清除所有关联。
有什么建议可以解决这个问题?我认为让Category
控制Items
的好处是可以轻松掌握Items
的顺序,而不是直接混淆。
但是你想要更新Category
本身的情况如何呢?首先加载并合并?
答案 0 :(得分:1)
对于你的问题,如果我们从高级别看到而没有进入代码,我发现问题不在于hibernate配置,而在于你如何处理实体。我建议你以下面的方式修改你处理实体的方式,
1)在将对象传递给UI之前,您没有提到过如何获取Category对象。因此,如果您使用get load方法简单地获取类别对象,那么您可以简单地创建单独的初始化方法,该方法可以通过简单地调用getter方法来加载项集合。通过getter方法,延迟加载的项目集合将被填充并且然后你可以将它传递给UI。用户只需修改类别,因此项目将保持不变。之后您可以保存该实体,因此项目将保持不变。
2)如果您不想在传递给UI之前加载项目集合,那么您可以只获取类别对象而不加载项目集合。将其传递给UI。一旦用户修改了&amp;将其传回,然后直接保存,我建议您先为该category_id&amp;获取最新的类别对象。通过调用getter来获取其项目,然后将UI返回类别中的更改值填充到此最新获取的类别中。现在,您可以保存此合并对象,以便您可以安全地收集项目。