java如何在FlatFileItemReader Spring批处理中使用@JoinColumn属性(实体)映射CSV字段
我使用spring批处理作业将数据从CSV文件插入MySql表。 实体属性之一是使用@ManyToOne生成的JoinColumn 我的问题是,CSV文件中ManyTone属性的字段被视为Entity@ID字段,并且没有与生成错误的JoinColumn进行映射
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
private String dept;
private Integer salary;
private Date endDate;
private Date time;
@ManyToOne
@JoinColumn(name = "carId", referencedColumnName = "id", foreignKey=@ForeignKey(name = "FK_Car_User"))
private Car car;
.....
Csv文件:
car_id,name1,dept1,salary1,endDate
1,Peter,001,12000,1970-07-28
2,Sam,002,13000,1970-07-28
1,Ryan,003,10000,1970-07-28
测线器
lineTokenizer.setDelimiter(",");
lineTokenizer.setStrict(false);
lineTokenizer.setNames(new String[]{"carId", "name2", "dept2", "salary2","endDate"});
Map<Class<?>, PropertyEditor> editors = new HashMap<>();
CustomDateEditor dateEditor = new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true);
editors.put(Date.class, dateEditor);
BeanWrapperFieldSetMapper<User> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
fieldSetMapper.setTargetType(User.class);
fieldSetMapper.setCustomEditors(editors);
defaultLineMapper.setLineTokenizer(lineTokenizer);
defaultLineMapper.setFieldSetMapper(fieldSetMapper);
错误是:
Data Saved for Users: [User{id=1, name='Peter', dept='Technology', salary=12000}, User{id=2,
name='Sam', dept='Operations', salary=13000}, User{id=1, name='Ryan', dept='Accounts',
salary=10000}]
2019-10-05 18:49:56.308 WARN 8984 --- [nio-8081-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper :
SQL Error: 23502, SQLState: 23502
2019-10-05 18:49:56.308 ERROR 8984 --- [nio-8081-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper :
NULL not allowed for column "CAR_ID"; SQL statement:
insert into user (id, car_id, dept, end_date, name, salary, time) values (null, ?, ?, ?, ?, ?, ?)
[23502-197]
谢谢你的建议
# 1 楼答案
解决方案包括: 1-创建自定义的FieldSetMapper类,而不是使用BeanRapperFieldSetMapper。 2-在FieldSetMapper自定义类中自动连接对象CarService(从存储库中获取汽车) 3-在mapFieldSet(FieldSet fs)方法的实现中,设置@ManyToOne属性如下 使用者setCar(carService.getCarById(fieldSet.readString(“carId”))