当集合为空时出现 OneToMany LazyInitializationException

dor*_*csi 1 hibernate jpa eager jpql

我知道有几十个问题具有相同的主题,但我无法弄清楚为什么它们在我的案例中不起作用。

我有两张表,一张的名称为 Account,一张的名称为 CustomerRelations,它们之间存在一对多的关系(一个帐户可以属于多个 customerRelations...一个帐户可以在没有其他客户关系的情况下存在,但有一个客户关系只能附加到现有帐户)

这就是它们在我的实体类中的注释方式:

账户表:

@OneToMany(mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
@OnDelete(action = OnDeleteAction.CASCADE)
private List<CustomRel> customRels = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

客户关系表:

@ManyToOne(fetch = FetchType.EAGER)
private Account account;
Run Code Online (Sandbox Code Playgroud)

我有业务逻辑,我想根据“帐户”选项卡中保存的特定日期调用查询:

@NamedQuery(name = Account.FIND_BY_ACC_NBR, query = "select acc from Account acc where acc.accountNumber =:accountNumber")
Run Code Online (Sandbox Code Playgroud)

此查询提供了帐户表中的正确数据,但对于字段 customerRels 我得到以下异常:

**Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.**
Run Code Online (Sandbox Code Playgroud)

当在我的 Account 对象上调用 getter 方法时,也会出现同样的情况:

在此输入图像描述

在我的示例中,有一个帐户对象,其中的 customerRels 列表为空。因此数据库中没有与 accountId 连接的 customerRels 记录。

据我所知,我的Account实体类中的fetchType是lazy-默认的,对吧?

在我创建表的 SQL 脚本中,CustomerRelations 表中仅添加了 account_id,Account 表中没有对子对象的引用。

我知道这是一个非常平庸的问题,但我需要一些帮助。我应该修改我的 JPQL 查询吗?

Pet*_*ály 5

OneToMany 是默认的 LAZY,并且您正在访问 hibernate 会话(运行事务)之外的集合。即使列表为空,也需要选择来初始化惰性集合。持久性无法知道集合中是否有项目,除非它检查数据库。

选项:

  1. FetchType.EAGER
  2. join fetch rels r在你的 JPQL 中
  3. 初始化事务/会话内的集合