JPA2 + Hibernate + Guice-persist:版本行为

时间:2012-04-26 19:19:09

标签: hibernate jpa-2.0 guice-persist

我使用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行已被更新或删除......”...

我想知道在保存对象时让实体管理器更新版本我需要做些什么...以及为什么坚持不执行此操作。

提前致谢。

2 个答案:

答案 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;
}