【问题标题】:How can you replicate Hibernate's saveOrUpdate in JPA?如何在 JPA 中复制 Hibernate 的 saveOrUpdate?
【发布时间】:2010-11-11 11:43:57
【问题描述】:

在JPA中,有什么方法可以复制Hibernate的saveOrUpdate behavior

saveOrUpdate

public void saveOrUpdate(Object object)
                  throws HibernateException

    Either save(Object) or update(Object) the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking).

    This operation cascades to associated instances if the association is mapped with cascade="save-update".

    Parameters:
        object - a transient or detached instance containing new or updated state 
    Throws:
        HibernateException
    See Also:
        save(Object), update(Object)

本质上检查对象是否已存在于数据库中,并根据需要更新该对象或保存该对象的新实例。

JPA 无事务读取很好,但我真的很想念 Hibernate 的这种方法。有经验的 JPA 开发人员如何处理这个问题?

【问题讨论】:

  • 检查“主键”是否为空怎么办?

标签: java hibernate jpa persistence


【解决方案1】:

尝试使用EntityManager.merge 方法 - 这非常相似。

Xebia 的博文中对不同之处进行了出色的描述:“JPA Implementation Patterns: Saving (Detached) Entities。”

【讨论】:

【解决方案2】:

Pablojim 链接到的文章中概述的方法的问题在于它不能很好地处理自动生成的主键。

考虑创建一个新的 ORM 实体对象,您可以给它提供与数据库表中现有行相同的数据,但除非我弄错了,否则实体管理器不会将它们识别为同一行,直到它们具有相同的主键,在使用自动生成的键的实体中,直到您进入数据库才能获得。

这是我目前针对这种情况所做的工作;

/**
 * Save an object into the database if it does not exist, else return
 * object that exists in the database.
 *
 * @param query query to find object in the database, should only return
 * one object.
 * @param entity Object to save or update.
 * @return Object in the database, whither it was prior or not.
 */
private Object saveOrUpdate(Query query, Object entity) {
    final int NO_RESULT = 0;
    final int RESULT = 1;

    //should return a list of ONE result, 
    // since the query should be finding unique objects
    List results = query.getResultList();
    switch (results.size()) {
        case NO_RESULT:
            em.persist(entity);
            return entity;
        case RESULT:
            return results.get(0);
        default:
            throw new NonUniqueResultException("Unexpected query results, " +
                    results.size());
    }
}

【讨论】:

  • merge 和 saveOrUpdate 表面上相似,但并不相同。语义有重要区别。
  • @skaffman,你认为我的方法有缺陷吗?如果是的话,你能否以我的方式提出一些建设性的批评。对于这个 JPA 东西,我是树林里的宝贝。
  • 刚找到这个旧线程,我正在实现类似这个解决方案的东西,除了新的 Java ENUMS。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
相关资源
最近更新 更多