Как отобразить поле CSV с помощью свойства @JoinColumn (Entity) в FlatFileItemReader - Spring Batch - PullRequest
0 голосов
/ 06 октября 2019

Я использую весеннее пакетное задание для вставки данных в таблицу MySql из файла CSV. одно из свойств Entity - это JoinColumn, созданный с помощью @ManyToOne. Моя проблема заключается в том, что поле в CSV-файле для свойства ManyToOne рассматривается как поле 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

LineMapper

    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 Ответ

0 голосов
/ 13 октября 2019

Решение состоит из: 1- Создайте настроенный класс FieldSetMapper вместо использования BeanWrapperFieldSetMapper. 2 - автоматическое подключение объекта CarService (для извлечения автомобиля из хранилища) в настраиваемом классе FieldSetMapper. 3 - в реализации метода mapFieldSet (FieldSet fs) установите свойство @ManyToOne следующим образом user.setCar (carService.getCarById (fieldSet.readString). ( "carId")));

...