Спящий вызов get () после save () для вновь созданной записи в рамках той же транзакции - PullRequest
1 голос
/ 03 сентября 2011

Я использую 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 () из той же транзакции.

1 Ответ

4 голосов
/ 03 сентября 2011

Вы пытались сделать Session.refresh () для объекта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...