集合为空时出现 OneToMany LazyInitializationException

OneToMany LazyInitializationException when collection is empty

我知道有几十个主题相同的问题,但我不明白为什么它们对我的情况不起作用。

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

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

帐号table:

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

客户关系table:

@ManyToOne(fetch = FetchType.EAGER)
private Account account;

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

@NamedQuery(name = Account.FIND_BY_ACC_NBR, query = "select acc from Account acc where acc.accountNumber =:accountNumber")

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

**Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.**

在我的 Account 对象上调用 getter 方法时也是如此:

在我的例子中,有一个客户对象的空列表。所以数据库中没有customerRels记录是连接到accountId的。

据我所知,我的帐户实体 class 中的 fetchType 是惰性的 - 作为默认设置,对吗?

在创建 table 的我的 SQL 脚本中,只有一个 account_id 添加到 CustomerRelations table 中,在帐户 table 没有对子对象的引用。

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

OneToMany 默认为 LAZY,您正在休眠会话之外访问集合(运行 事务)。即使列表是空的,也需要 select 来初始化惰性集合。 Persistence 无法知道集合中是否有项目,除非它在 ​​DB 中检查。

选项:

  1. FetchType.EAGER
  2. join fetch rels r 在你的 JPQL
  3. 初始化集合 transaction/session