java - Hibernate 嵌套延迟加载和 LazyInitializationException

标签 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,没有 session 或 session 已关闭

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

我知道如果我有权访问 hibernate session ,我可以手动初始化集合,但是有什么方法可以映射它以便 Hibernate 可以自己完成它吗?当我想要获取一些相关对象时,我不想使用我的自定义方法。

最佳答案

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

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

关于java - Hibernate 嵌套延迟加载和 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39511381/

相关文章:

java - 读取(日志)文件而不锁定其他进程的重命名/移动

javascript - H2 DB DAY_OF_WEEK 从星期一开始

java - 添加两个变量后出现 BeanCreationException

java - Hibernate 对象映射导致 SQL 错误 (errno : 150) with Liquibase

jpa - 在 glassfish 上部署 .EAR 时出现错误 "java.lang.NoClassDefFoundError: javax/persistence/EntityManager"

java - 在使用 AbstractRoutingDataSource 切换数据源时共享事务

java - 是否有用于选择目录和文件的 SWT 或 JFace 对话框?

java - 从 apache 网站导入库

java - 阴影未显示在 CardView 中

java - 数据库已更新,但选择查询在 hibernate 中未给出结果