Java Spring批处理自动提交数据库更新,即使没有在ItemWriter上指定它
我正在为我的下一个项目测试SpringBatch。在我的步骤中,我指出了我的Java Spring批处理自动提交数据库更新,即使没有在ItemWriter上指定它,java,spring,spring-boot,hibernate,spring-batch,Java,Spring,Spring Boot,Hibernate,Spring Batch,我正在为我的下一个项目测试SpringBatch。在我的步骤中,我指出了我的ItemReader、ItemProcessor和itemswriter 在我的ItemReader上,我仅使用JdbcPagingItemReader获取ID,并将其传递给itemroaperson,在那里它使用JpaRepository.findOne()获取整个实体。我在这里应用驱动查询模式 同时,在我的ItemProcessor实现中,我正在设置它的一个字段:setUpdated(newdate()) 然后在我的
ItemReader
、ItemProcessor
和itemswriter
在我的ItemReader
上,我仅使用JdbcPagingItemReader
获取ID,并将其传递给itemroaperson
,在那里它使用JpaRepository.findOne()获取整个实体。我在这里应用驱动查询模式
同时,在我的ItemProcessor
实现中,我正在设置它的一个字段:setUpdated(newdate())
然后在我的ItemWriter
上,我只是从ItemProcessor
记录传递的实体
我的问题是,当我检查日志时,hibernate正在更新表中的entities值,即使在我的ItemWriter
中我只是记录它
ItemProcessor实现:
public class IdToContractItemProcessor implements ItemProcessor<BigDecimal, Contract> {
@Override
public Contract process(BigDecimal id) {
Contract contract = repo.findOne(id.longValue());
contract.setUpdated(new Date());
return contract;
}
}
public class CustomItemWriter implements ItemWriter<Contract> {
@Override
public void write(List<? extends Contract> list) {
for (Contract c : list) {
log.info("id {}", c.getId());
}
}
}
公共类idToContractTempProcessor实现ItemProcessor{
@凌驾
公共合同流程(BigDecimal id){
合同=repo.findOne(id.longValue());
合同日期(新日期());
退货合同;
}
}
ItemWriter实现:
public class IdToContractItemProcessor implements ItemProcessor<BigDecimal, Contract> {
@Override
public Contract process(BigDecimal id) {
Contract contract = repo.findOne(id.longValue());
contract.setUpdated(new Date());
return contract;
}
}
public class CustomItemWriter implements ItemWriter<Contract> {
@Override
public void write(List<? extends Contract> list) {
for (Contract c : list) {
log.info("id {}", c.getId());
}
}
}
公共类CustomItemWriter实现ItemWriter{
@凌驾
public void write(列表),因为JPA就是这样工作的。在事务中,对实体的修改会自动持久化,您不需要在实体管理器上调用persist
或merge
。关于您的设置,您知道您的方法很慢(ID然后是实体)基本上,这是您在批处理中遇到的1+N选择问题)。Hi@M.Deinum感谢您对该事务的澄清。我现在明白了:)。此外,我使用的是ids then实体,因为起初我使用的是JpaPagingItemReader并更新实体的状态(这也是我在ItemReader中的where子句的一部分)在分页期间跳过某些项目。这是他们向我推荐的解决方案。如果您有任何建议来避免1+N选择,那就太好了。我仍在探索这个春季批次。无论如何,感谢您的帮助:)如果您使用分页,您必须确保您使用的是order by,否则它将不起作用,您将错过该项目s、 我已尝试按id添加订单,但在检查日志和我的表后,它在更新实体后仍会跳过项目。啊,是的。问题是更新也会影响查询结果。因此,您首先选择100,更新后(取决于区块大小),这将减少到(97)。您可以不使用分页,而是编写一个条目读取器来发出查询,并始终返回顶部的x(其中x是块大小),这样您就不会丢失记录。