JPA应用中如何正确设置Date对象并持久化到数据库
错误原因
- 你调用的
java.util.Date三参数构造方法已废弃,且传入的参数类型为String,和构造方法要求的int类型不匹配,因此无法生效。 - 该构造方法的参数规则和常规认知不符:第一个参数为「目标年份-1900」,第二个月份从0开始计数(1月对应0),第三个才是日期,哪怕你转成int传入,得到的日期也和预期不一致。
- 实体类中
Date类型字段未指定JPA temporal映射规则,部分JPA版本会出现存库异常。
解决方案
方案1:兼容旧java.util.Date写法(不推荐)
- 实体类字段补充
@Temporal注解:
@Column(name = "starting_date") @Temporal(TemporalType.DATE) private Date startingDate;
- 调整日期构造逻辑,用日期格式化类解析输入:
System.out.println("Enter Year: "); String year = new Scanner(System.in).next(); System.out.println("Enter month: "); String month = new Scanner(System.in).next(); System.out.println("Enter day: "); String day = new Scanner(System.in).next(); String dateStr = String.format("%s-%s-%s", year, month, day); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 注意处理ParseException Date startingDate = sdf.parse(dateStr); Semester semester = new Semester(); semester.setStartingDate(startingDate); repository.save(semester);
方案2:使用java.time.LocalDate(推荐,JDK8+支持)
JPA 2.2及以上版本原生支持java.time包下的日期类,无线程安全问题,API符合常规认知,无需偏移计算。
- 修改实体类字段类型:
@Column(name = "starting_date") private LocalDate startingDate;
- 调整日期构造逻辑:
System.out.println("Enter Year: "); int year = new Scanner(System.in).nextInt(); System.out.println("Enter month: "); int month = new Scanner(System.in).nextInt(); System.out.println("Enter day: "); int day = new Scanner(System.in).nextInt(); // 参数顺序为年、月(1-12)、日,无需偏移 LocalDate startingDate = LocalDate.of(year, month, day); Semester semester = new Semester(); semester.setStartingDate(startingDate); repository.save(semester);
内容的提问来源于stack exchange,提问作者Real Og
相关产品推荐
相关产品推荐

