You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JPA应用中如何正确设置Date对象并持久化到数据库

错误原因

  • 你调用的java.util.Date三参数构造方法已废弃,且传入的参数类型为String,和构造方法要求的int类型不匹配,因此无法生效。
  • 该构造方法的参数规则和常规认知不符:第一个参数为「目标年份-1900」,第二个月份从0开始计数(1月对应0),第三个才是日期,哪怕你转成int传入,得到的日期也和预期不一致。
  • 实体类中Date类型字段未指定JPA temporal映射规则,部分JPA版本会出现存库异常。

解决方案

方案1:兼容旧java.util.Date写法(不推荐)

  1. 实体类字段补充@Temporal注解:
@Column(name = "starting_date")
@Temporal(TemporalType.DATE)
private Date startingDate;
  1. 调整日期构造逻辑,用日期格式化类解析输入:
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符合常规认知,无需偏移计算。

  1. 修改实体类字段类型:
@Column(name = "starting_date")
private LocalDate startingDate;
  1. 调整日期构造逻辑:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:39:03