У меня есть метод, который использует объект Session для создания построителя критериев, а затем извлекает объект с именем Document (Document). Этот объект имеет два списка «один ко многим». Я хочу их инициализировать.
Даже когда сеанс открыт, он отказывается инициализировать два списка, выдавая сообщение «Сеанс не смог инициализировать прокси — нет сеанса» в строке: Hibernate.initialize(singleResult.getRevisoes());< /p>
Предлагаемое решение
Добавление @Transactional(Transactional.TxType.REQUIRED) в сигнатуру метода решает проблему. Однако открывает ли это новое соединение? Я трачу ресурсы? Есть ли лучший способ решить эту проблему?
Код: Выделить всё
@Autowired
protected Session session;
....
@Override
public Document find(Long id, boolean close) {
try {
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery queryDocument = criteriaBuilder.createQuery(Document.class);
Root rootDocument = queryDocument.from(Document.class);
queryDocument.select(rootDocument);
queryDocument.where(criteriaBuilder.equal(rootDocument.get("id"), id));
TypedQuery query = session.createQuery(queryDocument);
Document singleResult = query.getSingleResult();
System.out.println(session.isOpen()); //Returns true
//Initialize other lists (one to many)
Hibernate.initialize(singleResult.getRevisions());
Hibernate.initialize(singleResult.getFiles());
//
return singleResult;
} catch (Exception ex) {
throw ex;
} finally {
if (session != null && close) {
session.close();
}
}
}
https://codete.com/blog/spring-transact ... tion-modes
https://docs.spring.io/spring-framework ... ation.html
Подробнее здесь: https://stackoverflow.com/questions/781 ... dded-to-th