例如,我得到一个小对象图:
user
user.someCollection
someCollection已设置为lazy。所以,我得到了一个收集代理。
然后,我想在集合中添加一个项目,
user.someCollection.add(...);
如果打开会话,此操作将在我添加之前加载整个集合。所以,我关闭会议。如果我关闭会话,我无法将项目添加到proxyed-collection,hibernate不要让我这样做。所以我将user.someCollection替换为真正的集合:
user.someCollection= new HashSet<...>();
我将项目添加到此REAL集合并打开一个新会话以保存
user.someCollection.add(...);
session.save(user);
这样可以,即手动将代理替换为真实集合吗?
还是有更好的方法吗?
答案 0 :(得分:0)
这是我的建议,我以前做过这种类型,作为调整hibernate的一部分,我不得不提出以下解决方案
somecollection也是一种实体(POJO),表示该实体为SomeItem
。
因此,您可以创建user.someCollection
对象并将其保存到数据库,而不是使用SomeItem
路径添加项目。这样做,您无需加载用户实体的惰性集合。
<强>例如强>
Session sess = sessionFactory.getCurrentSession();
for(.....){
SomeItem si = new SomeItem(value1,value2,value3);
sess.saveOrUpdate(si);
}