Hibernate会话saveOrUpdate不会更新

时间:2014-01-20 05:35:03

标签: java hibernate session

我正在使用带有德比的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:

  • 它有一个自动生成的Long id
  • 它没有版本号,对它的所有更新都封装在一个事务中
  • 注释。我不使用映射,我使用注释。

我能想到的是,有些缓存已经出错了,除了我甚至没有使用任何缓存。第一次保存对象(使用不同的会话对象,以与上面相同的方式)工作正常。这是我遇到的更新问题。顺便说一下,我确实尝试过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

换句话说,提交确实成功了,但是会话没有意识到对象被修改了。所以问题就变成了,我怎么能告诉会话中有一个脏对象。我认为这应该是自动的,但显然在这种情况下不会发生。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您正在使用托管对象(obj),无需调用save / saveupdate。 hibernate将识别更改并调用更新。

答案 1 :(得分:0)

你应该试试 MyPersistentType obj = session.get(MyPersistentType.class, id); 而不是session.load(); session.load有时会返回一个代理对象(延迟初始化)。