我正在学习hibernate,我正在使用调试器来了解hibernate如何获取对象。我在我的XML中启用了延迟加载,我使用创建查询来获取对象。该对象具有与之关联的Set。
当我在调试器中查看变量值时,它似乎完全加载了对象图,即没有懒惰地获取集及其属性。我可以想到为什么会出现这种情况的几个原因。
1)我的xml / config出了问题,我启用了急切的抓取功能。我不确定是这种情况,一切都是默认的,这是懒惰的获取。
2)IDE调试器的工作方式是,当我查看它时,会导致hibernate触发延迟加载。
3)Hibernate从二级缓存中获取整个对象图。香港专业教育学院试图禁用此功能,但这似乎没有效果
还有其他想法吗?
答案 0 :(得分:5)
调试(显示惰性字段,确切地说)已经触发了延迟加载。获取实体,分离它并访问您的懒惰字段。如果延迟加载有效,应该抛出某种异常。
如果您真的想知道 hibernate如何,请查看来源。
答案 1 :(得分:2)
@ atamanroman的回答是完全正确的。我只是想补充一些细节。为了测试JavaEE环境中的延迟加载,我使用了Arquillian测试。在测试类中,使用UserTransaction
来控制事务边界。提交事务后,访问延迟加载的属性并期望Exception
@Inject
private UserTransaction tx;
@Test(expected=Exception.class)
public void testLazyLoading() throws Exception {
tx.begin();
MyEntity entity = em.find(entityId);
tx.commit();
entity.getLazyLoadedProperty().someMethod();
}
请注意,为了触发加载延迟加载属性,通常不足以在事务中调用getter,您还必须使用该属性执行某些操作,如调用size()
上的名单。否则,getter将只返回一个代理。