我使用Hibernate 3.6 Final,Guice-persist和JPA2。
太好了,我已经完成了所有配置,我的bean有一个@Version private Long version;
,带有getter和setter。
我已经在所有字段中实现了equals和hashcode。
我的dao保存方法是:
@Transactional
public void save(Product p){ em.persist(p); }
但是,如果我这样做:
Product p = new Product("name"); //id=null, version=null
dao.save(p); //works, id!=null, version=0
Product p2 = new Produto(10, 0, "other name"); //id, version, name
dao.save(p2); //works, but the version isnt updated, so my version still 0
然后,如果我更改名称并尝试再次保存,我得到“StaleObjectstateException行已被更新或删除......”...
我想知道在保存对象时让实体管理器更新版本我需要做些什么...以及为什么坚持不执行此操作。
提前致谢。
答案 0 :(得分:2)
(忽略代码说新的Produto而不是新产品) 对于p2,您在对象实例中设置id和版本,然后保持它。 在持久化对象的状态之后,p2与最后已知的持久状态保持不变 - >无需更新版本。
( 做一些像p2.setName(“另一个名字”),然后做p2.getVersion()...来看效果。
p otho没有任何版本,也没有通过代码或PresistenceContext由“你”直接设置。一旦你持久化p,就会在持久化上下文中进行管理,因此得到了一个版本号 - 在这种情况下,它获得了版本0(新创建)。
答案 1 :(得分:1)
我用这种方式解决了这个问题:
@Transactional
public void persist(B bean) {
em.persist(bean);
}
@Transactional
public B update(B bean) {
bean = em.merge(bean);
em.flush();
return bean;
}
然后我只调用save方法,这个方法知道它必须做什么:
@Transactional
public B save(B bean) {
if (bean == null || bean.getId() == null) {
persist(bean);
} else {
bean = update(bean);
}
return bean;
}