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 实体时,来自控制器的“No serializer found for class java.lang.Long ...”