【问题标题】:Trying to confirm lazy loading is working尝试确认延迟加载是否有效
【发布时间】:2013-02-20 16:44:51
【问题描述】:

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

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

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

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

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

还有其他想法吗?

【问题讨论】:

    标签: java hibernate lazy-loading


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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 将简单地返回一个代理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 2022-10-07
        • 1970-01-01
        • 2014-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多