hibernate,用瞬态集合替换集合代理,有更好的方法吗?

时间:2014-04-24 18:54:53

标签: java hibernate

例如,我得到一个小对象图:

user
user.someCollection

someCollection已设置为lazy。所以,我得到了一个收集代理。

然后,我想在集合中添加一个项目,

user.someCollection.add(...);

如果打开会话,此操作将在我添加之前加载整个集合。所以,我关闭会议。如果我关闭会话,我无法将项目添加到proxyed-collection,hibernate不要让我这样做。所以我将user.someCollection替换为真正的集合:

user.someCollection= new HashSet<...>();

我将项目添加到此REAL集合并打开一个新会话以保存

user.someCollection.add(...);
session.save(user);

这样可以,即手动将代理替换为真实集合吗?

还是有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

这是我的建议,我以前做过这种类型,作为调整hibernate的一部分,我不得不提出以下解决方案

somecollection也是一种实体(POJO),表示该实体为SomeItem

因此,您可以创建user.someCollection对象并将其保存到数据库,而不是使用SomeItem路径添加项目。这样做,您无需加载用户实体的惰性集合。

<强>例如

Session sess = sessionFactory.getCurrentSession();
for(.....){
    SomeItem si = new SomeItem(value1,value2,value3);


    sess.saveOrUpdate(si);
}