Hibernate 具有OneToMany层次结构的Spring批量插入
我使用SpringBatch读取和转换树状实体,并使用JpaItemWriter写入oracle数据库。对于树状实体,我的意思是:Hibernate 具有OneToMany层次结构的Spring批量插入,hibernate,jpa,spring-batch,transactional,Hibernate,Jpa,Spring Batch,Transactional,我使用SpringBatch读取和转换树状实体,并使用JpaItemWriter写入oracle数据库。对于树状实体,我的意思是: class A { @OneToMany List<B> bList; } class B { @OneToMany List<C> cList; } class C { @OneToMany List<D> dList; } class D { } A类{ @独身癖 列表
class A {
@OneToMany
List<B> bList;
}
class B {
@OneToMany
List<C> cList;
}
class C {
@OneToMany
List<D> dList;
}
class D {
}
A类{
@独身癖
列表列表;
}
B类{
@独身癖
列表cList;
}
C类{
@独身癖
名单;
}
D类{
}
关系的大小可以快速增长,但出于业务原因,需要在一个事务中同时保持整个实体。有了这个4级层次结构,我想知道是否可以使用某种Hibernate(JPA首选)方法以自顶向下的策略调用批量插入,使用spring JpaItemWriter通过一次对数据库的调用来持久化所有“B”实体,然后是所有“C”实体等等。。。而不是像调试日志显示的那样为每个实体插入一个。提前谢谢你的帮助 简单的回答是,如果您在ORM实现中使用Hibernate,这应该是可能的 Hibernate文档在某种程度上深入研究了批处理。如果配置正确,Hibernate将尝试在每个
flush()
(在每个块的末尾)期间按实体类型排序插入和更新
您还需要确保设置了以下属性,并且没有对ID使用标识生成器:
<prop key="hibernate.jdbc.batch_size">50<!--or some other number--></prop>
<prop key="hibernate.order_inserts">true</prop>
<prop key="hibernate.order_updates">true</prop>
<prop key="hibernate.jdbc.batch_versioned_data">true</prop>
50
真的
真的
真的
这说明了如何使用持久性单元执行相同的操作
现在,尽管如此,Hibernate可能很敏感,因此您可能希望增加BatchingBatcher类的日志记录,以确认它实际上正在对插入进行批处理。最后,请注意不使用序列的任何实体中的
saveOrUpdate()
方法。如果您正在定义自己的ID,而您的对象尚未在会话中(不会在会话中),Hibernate将首先对DB发出一个select
,以确定是否需要insert
或update
。谢谢@Dean。仅供参考,添加属性后,我的批处理例程核心处理从11分钟到仅1秒。批处理大小已配置,因此我将该值提高到100。再次感谢您的帮助:)