Hibernate嵌套延迟加载和LazyInitializationException

时间:2016-09-15 12:44:37

标签: java hibernate jpa exception lazy-initialization

我有一个类似下面的模型项目(伪代码):

class Transaction{

      @OneToMany(mappedBy="transaction", fetch = FetchType.LAZY)
      private Set<TransactionVersion> transactionVersions;
}

class TransactionVersion{

      @ManyToOne(fetch = FetchType.EAGER)
      @JoinColumn(name="ID_TRANSACTION_VERSION")
      private Transaction transaction;

      @ManyToOne(fetch = FetchType.EAGER)
      @JoinColumn(name="ID_CLIENT_VERSION")
      private ClientVersion clientVersion;
  }

  class ClientVersion{

      @OneToMany(mappedBy="clientVersion",fetch=FetchType.Lazy)
      private Set<TransactionVersion> transactionVersions;

      @OneToMany(mappedBy="client", fetch=FetchType.LAZY)
      private Set<Client> clients;
  }

现在,如果我尝试得到这样的东西(get(0)只是一个例子):

  transaction.getTransactionVersions().get(0)
 .getClientVersion().getClients()

我得到LazyInitializationException无法懒惰地初始化角色集合:ClientVersion.clients,没有关闭会话或会话

如果我将ClientVersion和Client之间的关系上的FetchType更改为EAGER,它可以正常工作,但我当然更喜欢懒惰地加载它。

我知道如果我可以访问hibernate会话,我可以手动初始化集合但是有没有办法映射它以便Hibernate可以自己做呢?当我想获得一些相关的对象时,我不想使用我的自定义方法。

1 个答案:

答案 0 :(得分:2)

使用 FetchType.LAZY 按需加载数据。但是,如果您超出会话范围,则无法加载它们,因为会话已经关闭。

使用 FetchType.EAGER ,您一次加载所有数据在数据库中执行连接,因此您没有例外,因为当您超出会话范围的数据已经加载,您无需从数据库中提取数据