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