如何使用Spring,Hibernate将具有自动值的数据插入到createdDate和updatedDate?

时间:2017-09-30 15:55:52

标签: java mysql spring hibernate

我想插入自动插入created_at日期时间和相应的updated_at日期时间的数据。

我有一个pojo:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;

@Basic(optional = false)
@Column(name = "name")
private String name;

@Basic(optional = false)
@CreationTimestamp
@Column(name = "created_at")
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;

@UpdateTimestamp
@Column(name = "updated_at")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedAt;

在我的数据库中,我使用DATETIME作为created_at和updated_at的类型。但我无法插入数据,而是提供错误消息 not-null属性引用空值或瞬态值:com.project.test.entity.Stamp.createdAt。

我想知道为created_at和updated_at DateTime字段定义数据库模式的正确方法,以使其自动生成。

2 个答案:

答案 0 :(得分:7)

您可以执行以下操作。

1)使用新日期()

初始化您创建和更新的日期
  @Basic(optional = false)
    @CreationTimestamp
    @Column(name = "created_at")
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdAt = new Date(); // initialize created date

    @UpdateTimestamp
    @Column(name = "updated_at")
    @Temporal(TemporalType.TIMESTAMP)

    private Date updatedAt=new Date(); // initialize  updated date

2)并通过 new Date()提供更新日期的setter方法,而不向其传递任何值:

 @PreUpdate
 public void setUpdatedAt() {  
       this.updatedAt= new Date(); 
 }

答案 1 :(得分:2)

编辑包含MYSQL表信息。

如果您希望您的真实来源是数据库,您可以使用@Generated并允许数据库设置创建更新时间戳。

@Generated(GenerationTime.Insert)
@Basic(optional = false)
@Column(name = "created_at")
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;

@Generated(GenerationTime.Always)
@Column(name = "updated_at")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedAt;

这是针对MYSQL数据库,您需要为列设置更新DEFAULT和ON UPDATE

 createdAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 updatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP