Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何复制Hibernate';在JPA中保存或更新?_Java_Hibernate_Jpa_Persistence - Fatal编程技术网

Java 如何复制Hibernate';在JPA中保存或更新?

Java 如何复制Hibernate';在JPA中保存或更新?,java,hibernate,jpa,persistence,Java,Hibernate,Jpa,Persistence,在JPA中,有没有任何方法可以复制Hibernate的 它主要检查对象是否已存在于数据库中,并根据需要更新该对象或保存该对象的新实例 JPA无事务读取很好,但我真的错过了Hibernate中的这个方法。有经验的JPA开发人员如何处理这个问题?尝试使用EntityManager.merge方法-这非常类似 Xebia的blogpost中有一个很好的差异描述:“.”Pablojim链接到的文章中概述的方法的问题是,它不能很好地处理自动生成的主键 考虑创建一个新的ORM实体对象,您可以为其提供与数据库

在JPA中,有没有任何方法可以复制Hibernate的

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


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

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


Xebia的blogpost中有一个很好的差异描述:“.”

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());
    }
}

在这里,我最大的收获是“更新现有实体时,我们不调用任何EntityManager方法;JPA提供程序将在刷新或提交时自动更新数据库。”链接已失效。这里是一个新的:merge和saveOrUpdate表面上很相似,但并不相同。语义有重要的区别。@skaffman,你认为我的方法有缺陷吗?如果是的话,你能给我一些建设性的批评吗。我是JPA的新手,刚找到这个旧线程,我正在实现类似这个解决方案的东西,除了新的Java枚举。谢谢。检查“主键”是否为空怎么样?
/**
 * 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());
    }
}