[英]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 语句:
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();
这要快得多并且有效
为此,您可以使用@SQLInsert
来使用批量插入。 请参阅使用 attachDirty (saveOrUpdate) 的 Hibernate 事务和并发
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.