Не удается заставить 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...

1 ответ

Я знаю, что не так: spring-data игнорирует типы выборки, пока вы не укажете аннотацию @EntityGraph как для метода в хранилище, так и для сущности.

Чертова часть состоит в том, что вы не можете переопределить метод из JpaRepository и добавить к нему @EntityGraph, потому что он игнорируется.

Вам нужно написать свои собственные методы в вашем хранилище... например:

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

Это сильно противоречит getOne(Long id) предоставлено JpaRepository, Очень запутанно. Так что может быть лучше просто назвать это getByIdEagerlyLoaded и напишите запрос самостоятельно @Query аннотирование

Другие вопросы по тегам