【问题标题】:JPA2 + Hibernate + Guice-persist: Version BehaviorJPA2 + Hibernate + Guice-persist:版本行为
【发布时间】:2012-04-26 19:19:08
【问题描述】:

我使用 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 row is updated or deleted by ...”...

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

提前致谢。

【问题讨论】:

    标签: hibernate jpa-2.0 guice-persist


    【解决方案1】:

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

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

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

    【讨论】:

    • hmm... 我明白了.. 问题是我使用 GWT,所以我必须转换到 DTO 等。所以,我必须做一些类似于我展示的示例的事情。 . 知道解决这个问题的好方法吗?实际上,我创建了一个“保存”方法,返回 bean,它决定是调用persist还是merge,当我调用merge时,我也执行flush,然后返回bean。这种方式可以工作,但很难看...顺便说一句,感谢您的回答:)
    • 抱歉,没有使用 GWT/GIN 的经验。一般来说,分离的实体可以制作不错的 DTO,但我不知道您是否需要针对当前用例的特殊特征。
    【解决方案2】:

    我是这样解决这个问题的:

    @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-06-29
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 2012-05-12
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多