2013-05-15 147 views
1

我使用Hibernate 4.1.10.Final作爲JPA提供者(與Spring容器),我努力堅持後,它更新一個JPA實體,但每次我得到消息的org.hibernate.StaleObjectStateException:行被更新或者刪除另一個事務(或未保存的值的映射是不正確的):... 我的代碼很簡單:保留後無法更新JPA實體?

@Transactional 
public void test() { 
    TestEntity e = new TestEntity(); 
    e.setName("test"); 
    ...... 
    em.persist(e); 
    ...... 
    e.setComment("memo..."); 
} 

有什麼東西錯了嗎? 非常感謝您的幫助。

+0

順便說一句,在TestEntity類有一個版本字段:@Version \t @Column(name = 「更新」,插入= FALSE) \t更新私人時間戳; – smile

回答

0

我們遇到同樣的問題,我們找到的解決方案是將實體的創建在另一個事務,但問題是,我們不能回滾創造:-(

如果有人有更好的解決方案提出,我的興趣太

1

遇到同樣的問題 - 使用JPA 2.0(休眠4.2.4.Final/Spring 3.2.8.RELEASE) 只有這樣,各地迄今已脫離實體,再次找到它,然後更新它 例如

e = new E(); // assume E has @ID int id; 
    em.persist(e); 
    em.detach(e); 
    e = em.find(e.getId()); 
    e.setFoo('foo'); 
    .. 

上面的工作,但它的黑客。至少它可以回滾

+0

更新:我的問題是,我有一個Timestamp字段上的@Version,它被物化爲mysql 5.6 Timestamp列。將定義更改爲Timestamp(3)可減輕對上述攻擊的需求。現在我們可以安全地執行em.persist(),接着是e.setFoo('foo'); – user5842