我正在使用带有德比的hibernate。我使用以下模式来保存我的对象:
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:
我能想到的是,有些缓存已经出错了,除了我甚至没有使用任何缓存。第一次保存对象(使用不同的会话对象,以与上面相同的方式)工作正常。这是我遇到的更新问题。顺便说一下,我确实尝试过session.flush()(没有充分的理由,只是为了完整性),session.merge()(即使对象是附加的)等没有工作。所以,我的问题是:
或者,如果您能想到其他任何事情。我完全被难倒了。
Edit1:执行上述序列后,我停止了服务并使用IJ连接到数据库。在所述表上执行select,我看到该表未被修改,即使提交没有失败。此外,日志显示以下行:
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 :(得分:0)
您正在使用托管对象(obj),无需调用save / saveupdate。 hibernate将识别更改并调用更新。
答案 1 :(得分:0)
你应该试试
MyPersistentType obj = session.get(MyPersistentType.class, id);
而不是session.load();
session.load有时会返回一个代理对象(延迟初始化)。