Я использую hibernate 3.2.7 без пружины (не спрашивайте, клиент не поддерживает пружину), и у меня возникла проблема с моей реализацией шаблона open-session-in-view.Когда я сохраняю объект в базе данных, вызывая save (), я затем вызываю get () для этого объекта, чтобы загрузить сведения о дочерних объектах, которые представлены внешними ключами в базе данных.Проблема в том, что когда я вызываю get (), ни один из дочерних объектов не загружается.Если я вызываю метод get () из новой транзакции, все загружается, как ожидалось.
Это фрагмент моего фильтра запросов, который открывает сеанс и создает транзакцию:
HibernateUtil.openSession();
//get a transaction from JTA
transaction = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
transaction.begin();
// Call the next filter (continue request processing)
chain.doFilter(request, response);
// Commit and cleanup
log.finer("Committing the database transaction");
transaction.commit();
Ниже приведен фрагмент метода сохранения уровня обслуживания, который сохраняет транзакцию:
session.setFlushMode(FlushMode.MANUAL);
contract.save();
//save the update to the database
session.flush();
После того, как объект сохраняется, запрос передается в класс действий Struts, который вызывает метод get () в службе, которая имеет этот код для загрузки контракта:
Session session = HibernateUtil.getSession();
session.setFlushMode(FlushMode.MANUAL);
try {
contract = contract.get();
...
}
То же самоеМетод get action вызывается при загрузке постоянного контракта, который работает нормально, поэтому я знаю, что метод get () работает правильно, когда изолирован в своей собственной транзакции.Единственный раз, когда он не работает, это когда он вызывается сразу после save () из той же транзакции.