我使用的是Hibernate3.6final、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行已由...更新或删除..."...
我想知道我必须做些什么才能让实体管理器在保存对象时更新版本……为什么persist没有做到这一点。
提前谢谢。
发布于 2012-05-03 19:05:29
我这样解决这个问题:
@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;
}发布于 2012-04-27 05:52:23
(忽略代码说的是新产品而不是新产品)对于p2,您在对象实例中设置id和版本,然后持久化它。持久化对象后,p2的状态与上一次已知的持久化状态->没有变化,不需要更新版本。
(执行类似p2.setName(“另一个名称”)的操作,然后执行p2.getVersion() ...来看看效果。
P otho没有任何版本,也没有由“你”通过代码或PresistenceContext直接设置的版本。一旦你持久化了p,它就会在持久化上下文中得到管理,并因此得到一个版本号--在本例中,它得到的是版本0(新创建的)。
https://stackoverflow.com/questions/10339940
复制相似问题