3

我正在学习休眠,并且正在使用调试器来了解休眠如何获取对象。我在我的 XML 中启用了延迟加载,并使用创建查询来获取对象。这个对象有一个与之关联的 Set。

当我在调试器中查看变量值时,它似乎完全加载了对象图,即没有懒惰地获取集合及其属性。我可以想到几个原因可能会出现这种情况。

1) 我的 xml / 配置有问题,我启用了急切获取。我不确定是不是这种情况,一切都是默认设置,即延迟获取。

2) IDE 调试器的工作方式是当我查看它们时导致休眠触发延迟加载。

3) Hibernate 正在从二级缓存中获取整个对象图。我试图禁用它,但这似乎没有效果

还有其他想法吗?

4

2 回答 2

6

调试(准确地说是显示延迟字段)已经触发延迟加载。获取实体,分离它并访问您的惰性字段。如果延迟加载有效,应该抛出某种异常。

如果您真的想知道hibernate 是如何做到的,请查看源代码。

于 2013-02-20T16:47:16.687 回答
3

@atamanroman 的回答是完全正确的。我只是想补充一些细节。为了在 JavaEE 环境中测试延迟加载,我使用了 Arquillian 测试。在测试类中,使用 aUserTransaction来控制事务边界。提交事务后,访问延迟加载的属性并期望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 将简单地返回一个代理。

于 2013-02-21T09:41:02.450 回答