JPA 一个实体中的两个惰性集合 - 如何运行 JPA 查询以获取实体和只有一个集合

Posted

技术标签:

【中文标题】JPA 一个实体中的两个惰性集合 - 如何运行 JPA 查询以获取实体和只有一个集合【英文标题】:JPA Two lazy collections in one entity - how to run JPA query to get entity and only one collection 【发布时间】:2017-06-02 20:16:37 【问题描述】:

我在编写正确的 JPA 查询以获取具有一个填充集合的实体时遇到问题。例如,我有两个集合的实体(我希望两个集合都有 FetchType.LAZY):

public class Entity 

private String value;   

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name="entity_id")
private List<ElementA> elementsA;

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name="entity_id")
private List<ElementB> elementsB;

我想运行 JPA 查询并仅获取有关实体和集合“elementsA”的信息。我正在尝试:

"From Entity e join fetch e.elementsA eA"

但我有错误:

Caused by: org.hibernate.LazyInitializationException: 
failed to lazily initialize a collection of role: 
model.jpa.entities.Entity.elementsB, 
could not initialize proxy - no Session

我应该如何编写此查询以仅获取有关集合“elementsA”的信息。

谢谢,达雷克。

【问题讨论】:

FWIW JPQL 以“SELECT e”开头,没有它是不可移植的。 【参考方案1】:

您的提取是正确的,但您的异常表明稍后在会话关闭后,在您调用 entity.getElementsB(); 的代码中某处触发另一个查询/提取,导致 LazyInitializationException 因为会话在那个时候关闭点。

【讨论】:

以上是关于JPA 一个实体中的两个惰性集合 - 如何运行 JPA 查询以获取实体和只有一个集合的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤 JPA/JPQL 中的集合?

引发错误:在序列化包含惰性“多对一”属性的 JPA 实体时,来自控制器的“No serializer found for class java.lang.Long ...”

为啥加载惰性集合

JPA - 多对多集合的分页查询返回错误数量的实体

如何使用 JPA 和 Hibernate 连接两个不相关的实体

JPA 使用指南 /Eclipselink/JPA 实体生成器