【问题标题】:How To map a CSV field with @JoinColumn property (Entity) in FlatFileItemReader - Spring Batch如何在 FlatFileItemReader 中使用 @JoinColumn 属性(实体)映射 CSV 字段 - Spring Batch
【发布时间】:2020-02-03 18:37:55
【问题描述】:

我正在使用 spring 批处理作业将数据从 CSV 文件插入到 MySql 表中。 Entity 属性之一是使用 @ManyToOne 生成的 JoinColumn 我的问题是 CSV 文件中 ManyToOne 属性的字段被视为实体 @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]

感谢您的建议

【问题讨论】:

  • 我更改了 DistenceLimte(0) 以完全匹配实体中的属性名称,但我收到与 @ManyToOne 连接列相关的错误 ------------- ----------------------------- 引起:org.springframework.beans.NotWritablePropertyException:bean 类 [com 的无效属性“carId” .techprimers.springbatchexample1.model.User]:Bean 属性“carId”不可写或具有无效的 setter m
  • 根据报错,需要carId的setter

标签: java spring hibernate spring-boot spring-batch


【解决方案1】:

解决方案包括: 1- 创建一个自定义的 FieldSetMapper 类而不是使用 BeanWrapperFieldSetMapper。 2- 在 FieldSetMapper 自定义类中自动装配对象 CarService(从存储库中获取汽车) 3-在mapFieldSet(FieldSet fs)方法的实现中设置@ManyToOne属性如下 user.setCar(carService.getCarById(fieldSet.readString("carId")));

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2019-08-22
    • 2021-12-09
    相关资源
    最近更新 更多