Я использую спящий режим с дерби. Я использую следующий шаблон, чтобы сохранить свои объекты:Спящий сеанс 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
Другими словами, коммит действительно преуспевал, но сессия не понимал, объект был изменен. Поэтому возникает вопрос, как я могу сказать сеансу, что в нем есть грязный объект. Я думал, что это должно быть автоматическим, но ясно, что это не происходит в этом случае.
Заранее спасибо.
Помимо журнала, вы проверили таблицу с данными? Когда вы обновляете запись, отражается ли она в дБ? – RAS
Нет, я этого не делал. Возможно, мне следует, но я использую дерби во встроенном режиме, то есть приложение или ij могут подключаться к нему, а не оба. Благодарю. –
Вы можете запустить Derby с файлом startNetworkServer.bat. Таким образом, допускается более одного соединения. –