LazyInitializationException при попытке извлечь кэшированный объект с помощью отложенного извлечения поля ManyToOne - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь использовать EhCache в качестве кэша L2 в приложении Spring Boot, используя Spring Data JPA и Hibernate. В настоящее время я испытываю проблему с кэшированием ленивого загруженного атрибута. У меня есть сущность, определенная следующим образом:

@Entity
@Cacheable
@Cache(usage = CacheConcurrentStrategy.READ_WRITE)
public class Foo {
  @Id
  private long id;

  @ManyToOne(fetch = LAZY)
  private Bar bar;
}

, и соответствующая сущность Bar также имеет аннотации кэширования. Мой запрос findById на FooRepository включает @EntityGraph(attributePaths="bar").

У меня есть контроллер, который использует DomainObjectConverter для автоматического выполнения запроса объекта Foo при вызове метода (я понимаю, что он ищет подходящий репозиторий и вызывает метод findById) ,

При первом вызове все работает нормально (и я могу разыменовать объект bar), но когда объект Foo извлекается из кэша L2, я получаю LazyInitializationException. Если я отмечу поле для извлечения EAGER, я могу видеть, что Bar извлекается из кеша, как я и надеюсь, но я бы хотел по возможности этого избежать, поскольку хочу убедиться, что мои запросы извлечения как максимально эффективный.

Я также пытался добавить аннотацию @Cacheable в поле bar, но, похоже, это не имеет значения.

...