首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拥有一个多个hibernate的最佳实践是什么?

拥有一个多个hibernate的最佳实践是什么?
EN

Stack Overflow用户
提问于 2010-05-20 04:23:38
回答 1查看 1.7K关注 0票数 4

我相信这是一个常见的情况。假设我在hibernate中有一个多个映射:Category有很多Items

类别:

代码语言:javascript
复制
@OneToMany(
    cascade = {CascadeType.ALL},fetch = FetchType.LAZY)
@JoinColumn(name="category_id")
@Cascade(
    value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN
)
private List<Item> items;

项目:

代码语言:javascript
复制
@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本身的情况又如何呢?先加载然后合并?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-22 11:47:42

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2870995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档