关于更新当前时间戳的Mysql 5.6列在hibernate中不起作用

时间:2015-12-18 06:25:31

标签: mysql hibernate jpa

我在表格答案中有一个名为lastModified的列,类似于

 +--------------+----------------+------+-----+-------------------+-----------------------------+
 | Field        | Type           | Null | Key | Default           | Extra                       |
 +--------------+----------------+------+-----+-------------------+-----------------------------+
 | answerId     | int(11)        | NO   | PRI | NULL              | auto_increment              |
 | totalComment | int(11)        | NO   |     | 0                 |                             |
 | totalView    | int(11)        | NO   |     | 0                 |                             |
 | totalSpam    | int(11)        | YES  |     | 0                 |                             |
 | lastModified | timestamp      | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
 +--------------+----------------+------+-----+-------------------+-----------------------------+

每当我手动更新到totalComment中的任何一个,mysql控制台中的totalView,totalSpam列时,lastModifed列也会被当前时间戳修改。但是,当我使用hibernate应用程序做同样的事情时,它没有被修改。

我的应用程序是作为spring数据jpa的一部分实现的。在application.yml中,我尝试使用 org.hibernate.dialect.MySQLDialect org.hibernate.dialect.MySQL5Dialect 但没有帮助。

在我的带注释的Answer实体类中,lastModified列声明为以下

@Column
private Date lastModified;

public Date getLastModified() {
    return lastModified;
}

public void setLastModified(Date lastModified) {
    this.lastModified = lastModified;
}

任何想法?

1 个答案:

答案 0 :(得分:5)

正如@Shadow所提到的,您当前的架构设计意味着您希望MySQL自动为您设置lastModified字段(on update CURRENT_TIMESTAMP)。因此,如果从Java代码传递null,那么它应该按预期工作。尝试使用列定义中的updatable = false选项告诉JPA不要向MySQL发送值:

@Column(name = "lastModified",
        updatable = false)
private Date lastModified;

我猜测当前正在发生的事情是Hibernate使用数据库中的值填充lastModified字段,然后您的JPA代码将此相同的值保持为MySQL的。所以似乎没有更新该值。但真正发生的是你的JPA代码 使用相同的旧值进行更新。