2010-05-20 48 views
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控制Items的好处是可以轻松掌握Items的顺序,而不是双向直接混淆。

但是你想更新Category本身的情况呢?首先加载并合并?

+0

我可以想到两种可能的方式: 1.先获取类别,然后根据UI返回的对象设置更新它的值。然后坚持下去。 2.使用丑陋的HibernateTemplate.bulkUpdate这是纯sql。 – Patrick 2010-05-20 04:33:31

+0

我错了关于HibernateTemplate.bulkUpdate。它使用HQL。目前我正在这样做。但我仍然愿意听到关于此主题的任何意见 – Patrick 2010-05-23 06:45:14

回答

1

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

1)你没有提到你如何在将它传递给UI之前获取Category对象。因此,如果您使用get load方法简单获取类别对象,那么您可以简单地创建单独的初始化方法,该方法可以通过简单地调用getter方法加载项目集合。通过getter方法延迟加载的项目集合将被填充&然后您可以将它传递给UI。用户只需修改类别,以便项目保持原样。之后,您可以保存该实体,以便项目保持原样。 2)如果你不想在传递给用户界面之前加载项目集合,那么你可以只读取没有加载项目集合的类别对象。将它传递给UI。一旦用户修改,&将其传回,然后不是直接保存它,而是建议您首先获取该category_id的最新类别对象,通过调用getters获取其项目,然后将UI返回类别中的更改值填充到此最新获取的类别中。现在你可以保存这个合并对象,这样你的物品收集是安全的。

+0

感谢您的答案。它太长了,我不记得上下文。但之后我学到了更多。从内存中可以看到实体一侧的逆向属性,然后解决这个问题。 – Patrick 2013-06-14 00:41:59

相关问题