java - 设置日期后无法保存实体

标签 java mysql spring spring-data-jpa

我将 Spring Boot 与 JPA 和 Lombok 结合使用。 我的 Sample 实体包含四个日期,approved 日期、样本日期以及维护的 createdAtmodifiedAt由 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.Datejava.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/

相关文章:

spring - Web应用程序后端架构

java - ElementList 中的 Android Magento Soap PersistenceException

java - 使用ant为项目中的特定文件创建Jar

mysql - 如何在Mysql中查找集合差异?

php - mysqli 无法显示完整数据

mysql - 错误 1452 : 23000 Cannot add or update a child row. ..mysql

Java Map实现渐进复杂度(HashMap、LinkedHashMap、TreeMap)

java - 序列化,在一个序列化的对象中有很多方法是不是很糟糕

java - spring snake 案例和验证错误响应

java - 使用json在c++和java之间交换对象