我将 Spring Boot 与 JPA 和 Lombok 结合使用。
我的 Sample 实体包含四个日期,approved 日期、样本日期以及维护的 createdAt
和 modifiedAt
由 JPA 本身使用 Auditable
类。 JPA 管理架构、运行 MySQL 的数据库以及所有日期列都是 DateTime
。所有日期都属于 java.util.Date
类。
示例实体(出于某些原因进行了简化)
@Entity
@Data
@EqualsAndHashCode(callSuper = false)
public class Sample extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id;
Date approved;
@DateTimeFormat(pattern = "yyyy-MM-dd'T'H:m")
Date sampleDate;
}
sampleDate
上的DateTimeFormat
是为了帮助 Spring 将表单数据转换为 java.util.Date
。
Auditable.java
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class Auditable {
@CreatedDate
@Column(name = "created_at", updatable = false, nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;
@LastModifiedDate
@Column(name = "modified_at")
@Temporal(TemporalType.TIMESTAMP)
private Date modifiedAt;
}
当我的 Controller 执行此操作时:
Sample s = sampleRepository.getOne(id);
s.setApproved(new Date());
sampleRepository.save(s);
Spring 生成此错误消息:
com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'approved' at row 1
最佳答案
你最好使用 LocalDateTime 而不是 java.util.Date
或 java.sql.Date
,如果你用 java >= 8 这样做的话。
Audited 实体的 createdDate、lastModifiedDate 应该由 Jpa Auditor(框架)设置,而不是由客户端(在这种情况下,您)设置。
此外,如果您想保留代码,可以尝试使用 @Temporal(TemporalType.DATE)
而不是 TemporalType.TIMESTAMP
。
已更新
抱歉,我错过了您提出的确切主题。
只需尝试在 Date approved;
上方添加 @Temporal(TemporalType.DATE)
。
关于java - 设置日期后无法保存实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58445083/