Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 具有OneToMany层次结构的Spring批量插入_Hibernate_Jpa_Spring Batch_Transactional - Fatal编程技术网

Hibernate 具有OneToMany层次结构的Spring批量插入

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类{ @独身癖 列表

我使用SpringBatch读取和转换树状实体,并使用JpaItemWriter写入oracle数据库。对于树状实体,我的意思是:

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。再次感谢您的帮助:)