如何解决在单个事务中插入多个实体|休眠,JPA
我正在尝试使用spring MVC创建一个POST端点,该端点负责创建多个实体对象。
在服务层,代码看起来像这样
entities.forEach(entity -> entityManager.persist(entity))
这是在单个工作单元中完成的,还是将一行一行地插入行?
解决方法
好吧,插入将始终是一个接一个,并且Hibernate将以这种方式处理它们。但是,您可以启用JDBC批量插入功能,这可能需要对插入语句进行一些重新排序,例如何时还需要插入从属实体。
例如,如果A引用了B,并且您想插入A1和B1以及A2和B2,则Hibernate必须将其重新排序为A1,A2,B1,B2
(或更可能是B1,B2,A1,A2
如果A具有外键)-这是您需要启用的功能。
请注意,要使用批处理,所有内容都必须在同一事务中运行,即您发布的行必须在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批处理大小。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。