У меня включен L2 и кеш запросов, и я сталкиваюсь со странной проблемой, когда у меня кешируется запрос.Все отношения в сущностях инициализируются ленивыми.Вот пример сущности, к которой я обращаюсь:
@Entity
@Cache(usage = READ_WRITE)
@Data
@NoArgsConstructor
@Accessors
@EqualsAndHashCode(of = "id", callSuper = false)
public class TestEntity {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
@Id
@Column(updatable = false)
private Long id;
@OneToOne(cascade = ALL, fetch = LAZY)
private AnotherTestEntity anotherTestEntity;
}
@Entity
@Cache(usage = READ_WRITE)
@Data
@NoArgsConstructor
@Accessors
@EqualsAndHashCode(of = "id", callSuper = false)
public class AnotherTestEntity {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
@Id
@Column(updatable = false)
private Long id;
@Column
private String property;
}
Когда я выполняю запрос, который не кэшируется:
@Transactional(readOnly = true)
public TestEntity findTestEntity() {
TestEntity testEntity = testEntityRepository.findOne(1);
testEntity.getAnotherTestEntity().getProperty();
return testEntity;
}
При первом запуске этого метода он запрашивает базу данныхи добавляет объект в кэш L2.Во второй раз, когда я вызываю его, он загружает объект из кэша L2, и он все еще работает нормально.
Проблема возникает, когда я вызываю кешированный запрос.Вот пример:
@Repository
public interface TestEntityRepository {
@Cachable(cacheNames = "testQuery")
TestEntity findOne(Long id);
}
Я буду использовать тот же метод:
@Transactional(readOnly = true)
public TestEntity findTestEntity() {
TestEntity testEntity = testEntityRepository.findOne(1);
testEntity.getAnotherTestEntity().getProperty();
return testEntity;
}
Когда я вызываю его в первый раз, он все еще работает, а точная загрузка данных из базы данных.Проблема возникает со вторым вызовом, когда он использует кеш запросов.Это исключение выдается, когда я получаю доступ к отложенному инициализированному отношению:
Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Я вижу, что сеанс отложенного инициализированного объекта является нулевым, но я не могу понять, почему это происходит.Поскольку мы знаем, что кеш запросов содержит только идентификаторы сущностей, связанных с этим запросом, он отправляется и извлекает их из L2 (ссылка: https://dzone.com/articles/pitfalls-hibernate-second-0).). Поэтому я не могу понять, почему первый пример (без кеша запросов)работает нормально, а второй ведет себя так странно. Может кто-нибудь объяснить и сказать мне, что я делаю неправильно?