如何实现泛型" saveOrUpdate" EclipseLink和JPA2的方法

时间:2012-05-10 19:50:12

标签: orm jpa-2.0 eclipselink

我正在尝试这样的方法,bug会出现并发问题..似乎我的更新方法不会增加我的实体的@Version属性。

我的代码是这样的:

      @Transactional
      public B save(B bean) {
        if (bean == null || bean.getId() == null) {
            persist(bean);
        } else {
            bean = update(bean);
        }
        return bean;
      }     

      protected final B update(B bean) {
        bean = em().merge(bean);
        em().flush();
        return bean;
      }

这是我的AbstractDao的一段代码。 em()方法返回由Guice-Persist管理的EntityManager。

另外,我正在使用eclipselink。

提前致谢

1 个答案:

答案 0 :(得分:1)

我用以下代码解决了这个问题:

protected final void persist(B bean) {
    em().persist(bean);
}

protected final B update(B bean) {
    bean.setVersion(findById(bean.getId()).getVersion());
    bean = em().merge(bean);
    em().flush();
    return bean;
}

@Transactional
public B save(B bean) {
    if (bean == null || bean.getId() == null) {
        persist(bean);
    } else {
        bean = update(bean);
    }
    return bean;
}