2

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

我想知道我必须做什么才能让实体管理器在保存对象时更新版本......以及为什么坚持不这样做。

提前致谢。

4

2 回答 2

2

(忽略代码中的新产品而不是新产品)对于 p2,您在对象实例化时设置 id 和版本,然后将其持久化。持久化后,对象 p2 的状态与上次已知的持久化状态相比没有变化 -> 无需更新版本。

(执行 p2.setName("yet another name") 之类的操作,然后执行 p2.getVersion() ... 查看效果。

p otho 没有任何版本,既不是由“你”直接通过代码或通过 PresistenceContext 设置的。一旦你持久化了 p,它就会在持久化上下文中得到管理,因此得到一个版本号——在这种情况下,它得到了版本 0(新创建的)。

于 2012-04-26T21:52:22.883 回答
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;
}
于 2012-05-03T11:05:28.900 回答