Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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
Java Spring批处理自动提交数据库更新,即使没有在ItemWriter上指定它_Java_Spring_Spring Boot_Hibernate_Spring Batch - Fatal编程技术网

Java Spring批处理自动提交数据库更新,即使没有在ItemWriter上指定它

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()) 然后在我的

我正在为我的下一个项目测试SpringBatch。在我的步骤中,我指出了我的
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是块大小),这样您就不会丢失记录。