关于进行一次多次休眠的最佳做法是什么

时间:2010-05-20 04:23:39

标签: hibernate one-to-many cascade

我认为这是一种常见的情况。假设我在休眠中有一对多的映射: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本身的情况如何呢?首先加载并合并?

1 个答案:

答案 0 :(得分:1)

对于你的问题,如果我们从高级别看到而没有进入代码,我发现问题不在于hibernate配置,而在于你如何处理实体。我建议你以下面的方式修改你处理实体的方式,

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

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

相关问题