在单个事务中插入多个实体| Hibernate,JPA



我正在尝试使用springMVC创建一个POST端点,该端点负责创建多个实体对象。

在服务层,代码看起来像这个

entities.forEach(entity -> entityManager.persist(entity))

这将在单个工作单元中完成,还是将一行接一行地插入?

插入总是一个接一个的,Hibernate将以这种方式处理它们。但是,您可以启用JDBC批处理插入,这可能需要对插入语句进行一些重新排序,例如,当还需要插入依赖实体时。

例如,如果A引用了B,并且您希望插入A1和B1以及A2和B2,那么Hibernate将不得不将其重新排序为A1, A2, B1, B2(如果A有外键,则更可能是B1, B2, A1, A2(,这是您需要启用的。

请注意,要使用批处理,所有内容都必须在同一事务中运行,即您发布的行必须在JTA事务或Hibernate会话上下文中运行。

Hibernate 5.4.20文档:https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/Hibernate_User_Guide.html#batch

不过需要注意的是:

  • 让Hibernate记录SQL语句可能会给人一种没有批处理的印象,但这只是一个日志问题
  • 如果您的服务要在一个事务中创建大量实体,您可能需要采取一些额外的步骤来防止脏检查等对性能产生负面影响(例如,在插入X个实体后拆分批处理并清除一级缓存-理想情况下,X是JDBC批处理大小(

最新更新