Spring和Hibernate:加载延迟集合

6
如何显式加载延迟的对象/集合? 到目前为止,我发现唯一的方法是在对象仍附加到会话时显式请求其getter/setter:即
List < Account > accounts = Bank.getAccounts();
accounts.get(i).getAccountNumber();

有没有其他不那么可疑的方法来做这件事呢?

顺便说一下,我使用的是Spring框架,所以根据调用的服务不同,我想要加载不同的集合/对象。

1个回答

13

我认为你所做的方式并不可疑;Hibernate 的目标是透明化。

然而,还有其他选择:

1)如果你想始终加载集合,可以在配置中将其设置为非懒加载。但要注意不要加载过多数据...

2)如果你想有时加载集合,那么保持懒加载为 true,并添加另一个 DAO 方法。

loadBankWithAccounts()

要么继续你正在做的,附带一个关于为什么要初始化集合的注释;要么使用带有fetch的HQL查询。请查看文档。

3) 查看Hibernate文档的第19.1.4节,该节描述了如何使用类似以下内容的东西

Hibernate.initialize(bank.getAccounts())

这使你在初始化集合时可以更加明确...


刚刚发现有类似于Hibernate.initialize(proxy Obj)的东西,但好像不起作用。问题出在一对一关系上。我只是执行了Hibernate.initialize(leerling.getFoto())。 - toomuchcs
@toomuchcs,我更新了我的答案,并添加了一些可能有用的内容,与你尝试的方向类似... - hvgotcodes
@toomuchcs Hibernate.initialize仅初始化简单字段,而不是关系... - Michael Wiles
@Michael Wiles:那么我该如何初始化另一个对象或集合呢? - toomuchcs
就像你在问题中展示的那样,调用关系上的get方法。这与任何情况下的“初始化”是一样的。这就是我一直做的 - 很有效。 - Michael Wiles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接