在Spring批处理中使用hibernate来读取数据

时间:2013-01-22 13:54:57

标签: java spring-batch

我正在使用Spring批处理框架的项目中工作。我是新手。

我有一个任务,就像读取固定长度的平面文件长度,然后处理它并填充一些bean,然后使用请求中的一些值,我必须使用Oracle从数据库中获取数据,然后生成一些响应作为固定长度的平面文件。

我已粘贴在配置文件中的小代码段下面。

<bean name="tickerReader"
        class="org.springframework.batch.item.file.FlatFileItemReader">
        <property name="resource" ref="fileSystemResource" />
        <property name="lineMapper" ref="tickerLineMapper" />
<bean>
 ..............................
 ..............................

<batch:job id="TickerPriceConversion">
        <batch:step id="convertPrice">
            <batch:tasklet transaction-manager="transactionManager">
                <batch:chunk reader="tickerReader" processor="tickerPriceProcessor"
                    writer="simbeqResponseFlatFileWriter" commit-interval="10" >
            </batch:chunk>
            </batch:tasklet>
        </batch:step>
    </batch:job>

我已完成阅读部分,即读取请求文件并填充相应的bean。现在我需要使用与请求中的数据相对应的hibernate从Oracle获取数据。我不知道怎么做?我该怎么做才意味着配置会话工厂并使用它来获取数据。

有人可以指导我吗?

2 个答案:

答案 0 :(得分:3)

您可以使用HibernateCursorItemReader

中的sample hibernate job
<bean id="hibernateItemReader"
    class="org.springframework.batch.item.database.HibernateCursorItemReader">
    <property name="queryString" value="from CustomerCredit" />
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

要设置sessionFactory和事务管理器,您还可以查看示例hibernate-context

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingLocations" value="classpath*:/org/springframework/batch/sample/domain/**/*.hbm.xml" />
    <property name="hibernateProperties">
        <value>
            <![CDATA[
        hibernate.show_sql=true
        hibernate.format_sql=true
        ]]>
        </value>
    </property>
</bean>

答案 1 :(得分:0)

@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;
    }

}