首页 > 解决方案 > 无法让 FetchType.EAGER 与 @ElementCollection 一起使用

问题描述

我在变量上有以下注释:

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "question_translation",
                 foreignKey = @ForeignKey(value = ConstraintMode.CONSTRAINT, name = "fk_question_translation_question"),
                 joinColumns = @JoinColumn(name = "question_id"))
@MapKeyColumn(name = "language", nullable = false)
@MapKeyEnumerated(EnumType.STRING)
@Column(name = "translation", nullable = false)
private Map<Language, String> translations;

当我在translations.get(Language.EN)外面做时,@Transactional我得到: org.hibernate.LazyInitializationException: could not initialize proxy - no Session

版本:

spring boot: <version>2.0.3.RELEASE</version>
<hibernate.version>5.2.17.Final</hibernate.version>
<hibernate-jpa-2.1-api.version>1.0.2.Final</hibernate-jpa-2.1-api.version>

我错过了什么?

编辑:

进一步搜索后,我认为问题是因为我使用 spring-data 及其存储库......他们似乎忽略了 fetch 类型......

标签: hibernatespring-data-jpalazy-loadingeager-loadingtransactional

解决方案


我知道出了什么问题:spring-data 会忽略获取类型,直到您在存储库中的方法和实体上都指定了 @EntityGraph 注释。

该死的部分是您不能覆盖 JpaRepository 中的方法并将@EntityGraph 添加到它,因为它被忽略了。

您需要在存储库中编写自己的方法...例如:

@EntityGraph(value = "graphNameDefinedOnEntity", type = EntityGraph.EntityGraphType.LOAD)
QuestionEntity getById(Long id);

这与getOne(Long id)提供的JpaRepository. 非常混乱。所以最好只命名它并使用注释getByIdEagerlyLoaded自己编写查询@Query


推荐阅读