首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA2 + Hibernate + Guice-persist:版本行为

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

Stack Overflow用户
提问于 2012-04-27 03:19:09
回答 2查看 503关注 0票数 2

我使用的是Hibernate3.6final、Guice-persist和JPA2。

非常好,我已经配置好了所有东西,并且我的bean有一个@Version private Long version;,带有getter和setter。

我用所有的字段实现了equals和hashcode。

我的dao保存方法是:

代码语言:javascript
复制
@Transactional
public void save(Product p){ em.persist(p); }

但是,如果我这样做:

代码语言:javascript
复制
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没有做到这一点。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-03 19:05:29

我这样解决这个问题:

代码语言:javascript
复制
@Transactional
public void persist(B bean) {
    em.persist(bean);
}

@Transactional
public B update(B bean) {
    bean = em.merge(bean);
    em.flush();
    return bean;
}

然后我只需调用save方法,这个方法知道它必须做什么:

代码语言:javascript
复制
@Transactional
public B save(B bean) {
    if (bean == null || bean.getId() == null) {
        persist(bean);
    } else {
        bean = update(bean);
    }
    return bean;
}
票数 1
EN

Stack Overflow用户

发布于 2012-04-27 05:52:23

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

(执行类似p2.setName(“另一个名称”)的操作,然后执行p2.getVersion() ...来看看效果。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10339940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档