【问题标题】:Hibernate nested lazy loading and LazyInitializationExceptionHibernate 嵌套延迟加载和 LazyInitializationException
【发布时间】:2016-09-15 12:44:37
【问题描述】:

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

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 failed to lazily initialize a collection of role: ClientVersion.clients, no session or session was closed

如果我将 ClientVersion 和 Client 之间关系的 FetchType 更改为 EAGER,它可以工作,但我当然更喜欢延迟加载。

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

【问题讨论】:

    标签: java hibernate jpa exception lazy-initialization


    【解决方案1】:

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

    使用 FetchType.EAGER一次性加载所有数据在数据库中执行联接,因此您不会出现异常,因为当您不在会话范围数据已经加载,您不需要从数据库中提取它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多