2012-01-06 60 views
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

如果你擔心併發更新,那麼你需要鎖定(悲觀或樂觀)。 – 2012-01-06 02:18:50

+3

如何使用saveOrUpdate()方法? – 2012-01-06 04:58:22

+0

我不想保存它...只更新它,如果它已被保存。 – 2012-01-06 10:54:05

回答

8

我建議你認準接口org.hibernate.Session那裏你可以找到包含的方法,這個方法看起來如果給定對象它與會話(永久)相關的,如果沒有,不等於它是分離的,因爲它可能與其他會話相關聯(如果有的話)。

+0

在該對象持久存在之前,該方法是否會返回true?我擔心的確切競爭條件是該對象已被髮送到數據庫進行持久性處理,但未包含在會話中。這意味着當我的其他線程更新對象時......更改將不會持續。 – 2012-01-06 11:03:57

+0

yes看到這裏http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html – 2012-01-06 11:57:50