Java 如何在spring批处理中使用HibernateCursorItemReader

Java 如何在spring批处理中使用HibernateCursorItemReader,java,spring,spring-batch,Java,Spring,Spring Batch,在spring批处理作业中,我有一个步骤,希望使用Hibernate从数据库中逐块读取数据,对其进行处理并将其写回数据库。现在我在设置阅读器时遇到了一些问题: @EnableBatchProcessing @配置 @ComponentScan(basePackages={“com.x.y.z.database”,“com.x.y.p.database”},排除过滤器={ @ComponentScan.Filter(type=FilterType.ASSIGNABLE\u type,value=C

在spring批处理作业中,我有一个步骤,希望使用Hibernate从数据库中逐块读取数据,对其进行处理并将其写回数据库。现在我在设置阅读器时遇到了一些问题:

@EnableBatchProcessing
@配置
@ComponentScan(basePackages={“com.x.y.z.database”,“com.x.y.p.database”},排除过滤器={
@ComponentScan.Filter(type=FilterType.ASSIGNABLE\u type,value=ConfigHelperMail.class)})
@EntityScan(basePackages={“com.x.y.z.database”,“com.x.y.p.database”})
@EnableJParepositions({“com.x.y.z.database”,“com.x.y.p.database”})
公共类批处理配置{
@自动连线
公共工作建筑工厂工作;
@豆子
公共作业作业(CustomJobListener侦听器,
@限定符(“步骤1”)步骤1,
@限定符(“步骤2”)步骤2,
@限定符(“步骤3”)步骤3){
return jobs.get(“SimpleJobName”)
.incrementer(新的RunIdIncrementer())
.防止重新启动()
.listener(侦听器)
.开始(步骤1)
.下一步(第2步)
.下一步(步骤3)
.build();
}
}
step1
writer中,我使用Hibernate将数据保存到数据库:

@实体
@表(name=“tmp_z_stepone”)
公共类StepOneEntity{
@身份证
@列(name=“reference”)
私有字符串引用;
/**其他属性以及getter和setter**/
}
@组成部分
公共类StepOneWriter实现ItemWriter{
@自动连线
私人StepOneService StepOneService;
@凌驾

公开无效写入(List
HibernateCursorItemReader
实现了
InitializingBean
接口,这意味着Spring将在容器初始化时调用其
AfterPropertieSet
,如果它被声明为bean。但是,在您的情况下,
HibernateCursorItemReader
在应用程序上下文中没有被声明为bean,它被包装在一个类(
StepTwoReader
)中,然后用
reader.read()
创建

如果在
read
方法中将
hibernateCursorOrItemReader
声明为当前代码的bean,则应获得一个
IllegalStateException
,并显示消息:“必须提供一个SessionFactory”。您实际上需要为Hibernate阅读器配置一个
SessionFactory

另一个选项是使用HibernateCursorOritemReaderBuilder,这将确保读卡器的配置正确。

@StepScope
@StepScope
@Slf4j
@Component
public class CursorItemReader extends HibernateCursorItemReader<ItemEntity> {


    public CursorItemReader(EntityManagerFactory entityManagerFactory,
                            @Value("#{stepExecution}")StepExecution stepExecution) {

       
        this.setName("CursorItemReader");
        this.setSessionFactory(entityManagerFactory.createEntityManager().unwrap(org.hibernate.Session.class).getSessionFactory());
        this.setQueryString("from ItemEntity");
        this.setUseStatelessSession(true);
        this.setFetchSize(5);
    }

    @Override
    public ItemEntity read() throws Exception {
        ItemEntity item = this.doRead();
        return item;
    }

}
@Slf4j @组成部分 公共类CursorItemReader扩展了HibernateCursorItemReader{ 公共游标阅读器(EntityManagerFactory EntityManagerFactory, @值(“#{stepExecution}”)stepExecution stepExecution){ 此.setName(“CursorItemReader”); this.setSessionFactory(entityManagerFactory.createEntityManager().unwrap(org.hibernate.Session.class).getSessionFactory()); 此.setQueryString(“来自ItemEntity”); 此.setUseStatelessSession(true); 此.setFetchSize(5); } @凌驾 public ItemEntity read()引发异常{ ItemEntity item=this.doRead(); 退货项目; } }
你也可以参考-

你能分享一个关于配置会话工厂或使用HibernateCursorsOritemReaderBuilder的例子吗?我是新手。谢谢。你可以在这里找到一个关于如何配置会话工厂以及如何使用生成器的例子:。如果回答了你的问题,请接受答案。
@StepScope
@Slf4j
@Component
public class CursorItemReader extends HibernateCursorItemReader<ItemEntity> {


    public CursorItemReader(EntityManagerFactory entityManagerFactory,
                            @Value("#{stepExecution}")StepExecution stepExecution) {

       
        this.setName("CursorItemReader");
        this.setSessionFactory(entityManagerFactory.createEntityManager().unwrap(org.hibernate.Session.class).getSessionFactory());
        this.setQueryString("from ItemEntity");
        this.setUseStatelessSession(true);
        this.setFetchSize(5);
    }

    @Override
    public ItemEntity read() throws Exception {
        ItemEntity item = this.doRead();
        return item;
    }

}