Hibernate如何检测对象在并发持久化中是否是瞬态的

3

我需要检测一个对象是否是短暂的...如果不是,我想通过Hibernate进行更新。

通常,我通过检查id是否已设置来实现此操作,但我担心这不是线程安全的,因为我有另一个线程正在保存对象,而且可能会出现id未设置但Hibernate已经在保存对象的情况。

如何以线程安全的方式实现这一点?

谢谢。

public void updateIfNotNew(PersistentObject a){
//if another object is in the process of saving....this update will not get persisted
    if (a.id!=null){  
        session.update(a);
     }
}

3
如果您担心并发更新问题,那么您需要锁定(无论是悲观锁还是乐观锁)。 - Nathan Hughes
3
使用saveOrUpdate()方法怎么样? - Viral Patel
我不想保存它,只有在已经保存的情况下才更新它。 - DD.
@Nathan 我不担心并发更新...我担心如何同时检查对象是否瞬态。 - DD.
1个回答

8

我建议你查找接口org.hibernate.Session,在那里可以找到方法contains,该方法将检查给定的对象是否与该会话相关联(持久性),如果没有,则并不意味着它是分离的,因为它可能与其他会话相关联。


那个方法在持久化对象之前会返回true吗?我担心的确切竞态条件是对象已被发送到数据库进行持久化,但未包含在会话中。这意味着当我的其他线程更新对象时...更改将不会被持久化。 - DD.
请查看此处:http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html - Muhammad Imran Tariq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接