【问题标题】:Hibernate disconnect proxy when fetch=FetchType.LAZY当 fetch=FetchType.LAZY 时休眠断开代理
【发布时间】:2010-12-14 13:59:56
【问题描述】:
@Entity
public class Master implements Serializable{
private List slaves;
@OneToMany(mappedBy = "Master",fetch=FetchType.LAZY)
public List getSlaves() {
   return slaves;
}
}

I want this code to pass.

List m = createQuery("from Master where id=1").getResultList();
for (Master master : m) {
    assertNull(master.getSlaves());
}

我希望 getSlaves() 返回 null 而不是初始化代理以连接到数据库(这个主服务器有从服务器,我不想从数据库中删除它们)。

有没有办法在 Hibernate 或 JPA 中做到这一点?

当 fetch 是 EAGER 时,还有没有办法做到这一点?

【问题讨论】:

    标签: java hibernate jpa lazy-loading eager-loading


    【解决方案1】:

    静默失败的代理是一件很难调试的事情。

    看到hibernate的代码后,我认为你没有配置它的选项。您可以尝试反射性地调用collection.setInitialized() 来伪初始化集合,但这会很丑陋。

    【讨论】:

      【解决方案2】:

      如果我理解正确的话,你想要一个实际上有奴隶的主人为奴隶列表返回一个空值吗?这是在测试环境中吗?您确定这是您想要的,并且您走在正确的轨道上吗?

      另一种丑陋的方法是将从属列表显式设置为空。只要您在同一个会话中,这将确保 getSlaves() 返回 null,但实际上不会在数据库中更改任何内容(至少对于休眠)。这种方法也适用于急切的收集。

      【讨论】:

        【解决方案3】:

        对集合的获取不应返回 null。您通过返回 null 在代码中设置了一个陷阱。

        而是让它返回一个空集并断言该集为空

        assertTrue(master.getSlaves().size() == 0);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-27
          • 1970-01-01
          • 2013-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多