2014-01-20 6 views
2

Я использую спящий режим с дерби. Я использую следующий шаблон, чтобы сохранить свои объекты:Спящий сеанс saveOrUpdate не обновляется

Session session = null 
Transaction tx = null; 
try { 
    session = mySessionFactory.openSession(); 
    tx = session.beginTransaction(); 
    MyPersistentType obj = session.load(MyPersistentType.class, id); 
    obj.setAttribute(attr); 
    session.saveOrUpdate(obj); 
    tx.commit(); 
    log.debug("Committed"); 
} catch (Exception e) { 
    if (tx != null) tx.rollback(); 
} finally { 
    if (session != null) session.close(); 
} 

В выше, я уверен flushMode является AUTO, мое утверждение журнала печатает, а журналы показывают, что JDBC соединение было совершено с новым атрибутом у меня есть установлен на мой объект. Однако в следующий раз, когда я выберу объект из БД (и это произойдет через секунду позже), объект, который будет извлечен, имеет исходное значение, а не только новое.

О мой MyPersistentType:

  • Он имеет автогенерируемая Long ID
  • Он не имеет номер версии, все обновления к нему заключены в рамках транзакции
  • Он аннотированный. Я не использую отображение, я использую аннотации.

Все, о чем я могу думать, это то, что некоторое кэширование пошло не так, за исключением того, что я даже не использую кеш. Сохранение объекта в первый раз (с использованием другого объекта сеанса, таким же образом, как описано выше) отлично работает. Это обновления, с которыми я столкнулся. BTW, я попробовал session.flush() (без уважительной причины, просто для полноты), session.merge() (даже если объект подключен) и т. Д. Ничего не работало. Итак, мой вопрос (вопросы):

  • Может ли это быть проблемой кэширования?
  • Если так я могу заставить этот запрос попасть на диск каждый раз

Или если что-нибудь еще вы можете думать. Я полностью в тупике.

Редактирование 1: После выполнения этой последовательности, я остановил службу и подключился к БД с помощью IJ. Выполняя выбор в указанной таблице, я увидел, что таблица не была изменена, хотя фиксация не завершилась. Кроме того, журнал содержит следующие строки:

org.hibernate.event.internal.AbstractFlushingEventListener - Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects 
org.hibernate.event.internal.AbstractFlushingEventListener - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections 

Другими словами, коммит действительно преуспевал, но сессия не понимал, объект был изменен. Поэтому возникает вопрос, как я могу сказать сеансу, что в нем есть грязный объект. Я думал, что это должно быть автоматическим, но ясно, что это не происходит в этом случае.

Заранее спасибо.

+0

Помимо журнала, вы проверили таблицу с данными? Когда вы обновляете запись, отражается ли она в дБ? – RAS

+0

Нет, я этого не делал. Возможно, мне следует, но я использую дерби во встроенном режиме, то есть приложение или ij могут подключаться к нему, а не оба. Благодарю. –

+0

Вы можете запустить Derby с файлом startNetworkServer.bat. Таким образом, допускается более одного соединения. –

ответ

0

У вас есть объект управления (obj), не нужно вызывать save/saveupdate. hibernate будет распознавать изменения и вызывать обновления.

0

Вы должны попробовать MyPersistentType obj = session.get(MyPersistentType.class, id); вместо session.load(); Session.load иногда возвращает прокси-объект (ленивым инициализирована).

Смежные вопросы