Spring boot 无法使用Spring批处理在数据库中插入行+;弹簧数据
我正在使用传统数据库,其中db表没有键。为了java,我不得不使用Id注释。我的目标是从.dat文件中读取数据并将其插入表中。我使用SpringBatch实现上述目的。为了提高性能,使用了线程。但我遇到了无法解决的插入/更新问题。我引用了很多资料,但似乎没有一个能解决我的问题。请给我一些合适的解决方案或参考。先谢谢你 Entity.javaSpring boot 无法使用Spring批处理在数据库中插入行+;弹簧数据,spring-boot,spring-data-jpa,spring-data,spring-batch,Spring Boot,Spring Data Jpa,Spring Data,Spring Batch,我正在使用传统数据库,其中db表没有键。为了java,我不得不使用Id注释。我的目标是从.dat文件中读取数据并将其插入表中。我使用SpringBatch实现上述目的。为了提高性能,使用了线程。但我遇到了无法解决的插入/更新问题。我引用了很多资料,但似乎没有一个能解决我的问题。请给我一些合适的解决方案或参考。先谢谢你 Entity.java @Entity @Table(name = "int_repl_mkt_val") public class IntReplMktVal implement
@Entity
@Table(name = "int_repl_mkt_val")
public class IntReplMktVal implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private IntReplMktValId id;
@Column(name = "acct_sys_cd")
private String acctSysCd;
@Column(name = "co_num", nullable = false)
private Integer coNum;
@Column(name = "last_mod_tmstmp")
@Temporal(TemporalType.TIMESTAMP)
private Date lastModTmstmp;
@Column(name = "pim_owned", nullable = false)
private String pimOwned;
@Column(name = "position", nullable = false)
private BigDecimal position;
@Column(name = "pricing_plan")
private String pricingPlan;
@Column(name="source_system",nullable=false)
private String sourceSystem;
... getter and setter
}
EmbeddedClass.java
@Embeddable
public class IntReplMktValId implements Serializable
{
private static final long serialVersionUID = 4824041485763129937L;
@Column(name = "acct_id",nullable=false)
private Integer acctId;
@Column(name = "asset_id",nullable=false)
private Integer assetId;
... getter and setter
}
jpaRepository.class
@Repository
public interface IntReplMktValRepository extends JpaRepository<IntReplMktVal, IntReplMktValId>
{
}
注意:我必须将所有数据插入表中,而不考虑重复或任何其他问题,因为没有定义键,所以所有数据都是有效的。事实上,问题是由于在持久性上下文中发现了重复,通过将区块大小设置为1来解决。您可以更改目标表吗?是的,我可以执行DML命令。。。
@Configuration
public class IMAPPositionBatchConfiguration
{
@Autowired
JobBuilderFactory jobBuilderFactory;
@Autowired
StepBuilderFactory stepBuilderFactory;
@StepScope
@Bean(name="imapPositionReader")
public FlatFileItemReader<IMAPPositionInputMapperDTO> reader(@Value("#{jobParameters['fileName']}") String fileName) throws IOException
{
FlatFileItemReader<IMAPPositionInputMapperDTO> newBean = new FlatFileItemReader<>();
newBean.setName("fileReader");
newBean.setResource(new InputStreamResource(FileUtils.openInputStream(new File(fileName))));
newBean.setLineMapper(this.lineMapper());
newBean.setLinesToSkip(1);
return newBean;
}
public DefaultLineMapper<IMAPPositionInputMapperDTO> lineMapper()
{
DefaultLineMapper<IMAPPositionInputMapperDTO> lineMapper = new DefaultLineMapper<>();
lineMapper.setLineTokenizer(this.lineTokenizer());
IMAPPositionReader imapPositionReader = new IMAPPositionReader();
lineMapper.setFieldSetMapper(imapPositionReader);
return lineMapper;
}
public DelimitedLineTokenizer lineTokenizer()
{
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setDelimiter("|");
tokenizer.setNames("field1","field2","field3");
tokenizer.setIncludedFields(5,4,7);
return tokenizer;
}
public ItemProcessor<IMAPPositionInputMapperDTO, IntReplMktVal> processor()
{
return new IMAPPositionProcessor();
}
@Bean(name="imapPositionBatchWriter")
public ItemWriter<IntReplMktVal> writer()
{
return new IMAPPositionWriter();
}
@Bean(name="imapPositionListener")
public JobExecutionListenerSupport jobCompletionListener()
{
return new IMAPPositionJobListener();
}
@Bean(name="imapPositionTaskExecutor")
public ThreadPoolTaskExecutor taskExecutor()
{
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(50);
executor.setMaxPoolSize(100);
return executor;
}
@Bean(name="imapPositionStep")
public Step step(@Autowired @Qualifier("imapPositionTaskExecutor")TaskExecutor taskExecutor) throws IOException
{
return stepBuilderFactory.get("imapPositionStep")
.<IMAPPositionInputMapperDTO, IntReplMktVal>chunk(100)
.reader(this.reader(null))
.processor(this.processor())
.writer(this.writer())
.taskExecutor(taskExecutor)
.build();
}
@Bean(name="imapPositionFileImportJob")
public Job importUserJob(@Autowired @Qualifier("imapPositionStep") Step step)
{
return jobBuilderFactory
.get("imapPositionFileImportJob"+new Date())
.incrementer(new RunIdIncrementer())
.listener(this.jobCompletionListener())
.flow(step)
.end()
.build();
}
}
public class IMAPPositionWriter implements ItemWriter<IntReplMktVal>
{
@Autowired
IntReplMktValRepository intReplMktValRepository;
@Override
public void write(List<? extends IntReplMktVal> items) throws Exception
{
intReplMktValRepository.saveAll(items);
}
}
2019-06-07 17:22:01,522 ERROR [scopedTarget.imapPositionTaskExecutor-4] org.hibernate.internal.ExceptionMapperStandardImpl : HHH000346: Error during managed flush [org.hibernate.HibernateException: Duplicate identifier in table for: [com.capgroup.horizon.pricecapture.entities.IntReplMktVal#component[acctId,assetId]{assetId=274800, acctId=1}]]