当前位置: 首页 > 知识库问答 >
问题:

用Hibernate合并多个对象

龙嘉玉
2023-03-14

我正在将JPA与Hibernate和Spring启动器数据jpa一起使用。我想合并/更新一组项目。如果它是一个新项目,我想保留,如果它是一个已经存在的项目,我想更新它。

    @PersistenceContext(unitName = "itemEntityManager")
    private EntityManager em;

    @Transactional
    public void saveItems(Set<Item>> items) {
        items.forEach(em::merge);
    }

当我这样尝试时,每个项目都会创建一个新的HQL状态并且它不起作用。所以我正在寻找一种方法来一次性保存所有项目(如果可能的话),以节省调用和时间。

我发现:

        EntityTransaction transaction = em.getTransaction();
        transaction.begin();
        items.forEach(em::merge);
        transaction.commit();

但是我不能使用这个事务,因为我使用了@Transactional。有办法用原生SQL吗?

共有2个答案

韦辰钊
2023-03-14

我创建了一个本机 SQL 语句:

  1. 我以sql格式将所有项目作为值列表连接
String sqlValues = String.join(",", items.stream().map(this::toSqlEntry).collect(Collectors.toSet()));
    em.createNativeQuery("INSERT INTO config_item"
                + "( id, eaid, name, type, road, offs, created, deleted )"
                + " VALUES " + sqlValues
                + " ON CONFLICT (id) DO UPDATE "
                + " SET "
                    + "eaid=excluded.eaid,\n"
                    + "name=excluded.name,\n"
                    + "type=excluded.type,\n"
                    + "road=excluded.road,\n"
                    + "offs=excluded.offs,\n"
                    + "created=excluded.created,\n"
                    + "deleted=excluded.deleted;"
        ).executeUpdate();

这要快得多,并且有效

钱劲
2023-03-14

为此,可以使用@SQLInsert来使用批插入。请参阅Hibernate事务和使用attachDirty(保存或更新)的并发

 类似资料:
  • 问题内容: 我已经建立了一个简单的多对多关系帐户:Hibernate角色,但是当我在添加角色后尝试在单元测试中保存帐户时,出现UnsupportedOperationException异常: 这是怎么了 我的实体设置有问题吗?或者这是hibernate或JPA限制,迫使我将m:m关系分解为3:n关系,也为m:n关系表建模(我想避免这种情况,因为它没有任何关系)附加信息)。我已经在原型中为其他1:n

  • 问题内容: 我正在测试hibernate并将此查询提供给 我在命令行中得到这些查询: 我使用的是“合并不保存”,所以为什么hibernate正在更新我的对象,所以不应该更新。对吗 怎么了 问题答案: 我将尝试使用一个更具体的示例进行解释。假设您有以下情况: 尝试重新附加分离的对象时发生异常,userA。 为了解决上述问题,使用了merge(),如下所示:

  • 我试图连接多个表,并将表列映射到用户对象列表。 下面是SQL查询,我正在尝试使用Hibernate条件转换为ORM: 从上面的查询中,我们将获得一个用户对象列表,并尝试将结果映射到用户对象。下面是要形成的用户对象的POJO类。 如何连接多个表和相应列到用户对象的映射? 谢谢你的帮助。。谢谢

  • 我正在使用hibernate映射来自mysql数据库的数据。 以下是我的查询: 并得到一个错误: Apache Tomcat/7.0.23-错误报告 键入异常报告 注意可获得根本原因的完整堆栈跟踪

  • 我想使用联接表在两个表之间建立一对多关系。 这就是为什么我想使用联接表: Hibernate单向一对多关联-为什么连接表更好 最后,我想使用Hibernate注释来执行此操作。 我找到了一些使用xml映射实现这一点的示例,但没有使用注释。 我相信这将是如何创建表需要

  • 我有一个类似这样的数组: 我想要一个如下所示的结果对象: 我如何在Javascript中实现这一点?