2013-05-15 112 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