繁体   English   中英

使用 Hibernate 合并多个对象

[英]Merge multiple objects with Hibernate

我在 Hibernate 和 spring-boot-starter-data-jpa 中使用 JPA。 我想合并/更新一组项目。 如果它是一个新项目,我想坚持下去,如果它是一个已经存在的项目,我想更新它。

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

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

当我这样尝试时,每个 Item 都会创建一个新的 HQL 语句并且它是inperformant 所以我正在寻找一种方法来一次性保存所有项目(如果可能的话),以节省电话和时间。

我找到了这个:

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

但我无法使用此事务,因为我使用了@Transactional 有没有办法使用本机 SQL?

我创建了一个原生 SQL 语句:

  1. 我将所有项目作为 sql 格式的值列表加入
String sqlValues = String.join(",", items.stream().map(this::toSqlEntry).collect(Collectors.toSet()));
  1. 然后我调用了一个本地查询
    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();

这要快得多并且有效

为此,您可以使用@SQLInsert来使用批量插入。 请参阅使用 attachDirty (saveOrUpdate) 的 Hibernate 事务和并发

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM