【问题标题】:How to insert data with automatic value to createdDate and updatedDate using Spring, Hibernate?如何使用 Spring、Hibernate 将具有自动值的数据插入 createdDate 和 updatedDate?
【发布时间】:2018-03-12 06:44:53
【问题描述】:

我想插入数据,自动插入 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 property references a null or transient value: com.project.test.entity.Stamp.createdAt.

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

【问题讨论】:

  • 将mysql中的列更改为时间戳:ALTER TABLE yourTable CHANGE COLUMN created_at created_at TIMESTAMP NOT NULL DEFAULT now(); updated_at 相同,但没有默认的 now()。无论如何,如果你使用的是休眠,你为什么要创建你的数据库?你为什么不让hibernate为你做呢?
  • 我尝试将 DATETIME 更改为 TIMESTAMP 类型并将默认值更改为 CURRENT_TIMESTAMP 但仍然存在同样的问题。与 updated_at 相同,仅将 Extra 字段中的更改为 on_update_current_timestamp 和 Default value = None。但是我的问题没有运气。 @JorgeCampos

标签: java mysql spring hibernate


【解决方案1】:

您可以执行以下操作。

1) 使用 new Date() 初始化您创建和更新的日期:

@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(); 
}

【讨论】:

  • 你能帮我定义 createdAt 和 updateAt 的数据库模式吗...目前我正在使用 TIMESTAMP 和 CURRENT_TIMESTAMP 作为 createdAt 的默认值和 TIMESTAMP 的 Null 值 YES 和 on_update_current_timestamp 作为额外字段...如何集成您的代码以匹配与更新功能相关的所有功能...因为此代码更新不起作用...@Raju Sharma
  • 更新不起作用?您能否更新并让我们知道您对相关实体和数据库进行了哪些尝试? B/W,您可以将 Null 值 No 用于 createdAt ,类型为 Timestamp 并将默认值设置为 CURRENT_TIMESTAMP , Null 值设置为 No 并将属性设置为 on_update_current_timestamp 用于 updateAt。因此您只需从代码中插入 createdAt 日期,数据库会将 updateAt 设置为修改后的日期时间
  • 我只是注意到在创建新行时插入了两列,但这并不是我认为的实际事实。 created_at 列将在生成行时被填充。另一方面,updated_at 将在任何列发生更改时被填充。我说的对吗?
【解决方案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;

这是您需要为列设置更新默认值和ON UPDATE 的MYSQL 数据库。

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

【讨论】:

  • 休眠更新操作在这里不起作用...public void updateName(Stamp s) { session = sessionFactory.openSession(); session.update(s); session.close(); }
  • 让我们进行一些调试并确保数据库正在执行您认为应该执行的操作。您能否对表进行基本插入并确保 createAt 和 updateAt 设置正确。之后做一个简单的更新并确保更新了 updatedAt 。确保数据库正确。
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2011-11-14
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多