2015-12-18 61 views
3

我在表的答案被稱爲上次更改時間列,像下面上更新當前的時間戳的Mysql 5.6列在休眠不工作

+--------------+----------------+------+-----+-------------------+-----------------------------+ 
| 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 | 
+--------------+----------------+------+-----+-------------------+-----------------------------+ 

每當我manullay更新到totalComment,TotalView軟件中的任何一個,totalSpam列mysql控制檯的lastModifed列也使用當前時間戳進行修改。但是當我用hibernate應用程序做同樣的事情時,它不會被修改。

我的應用程序是作爲spring數據jpa的一部分實現的。在application.yml中,我嘗試使用org.hibernate.dialect.MySQLDialect和兩者都使用org.hibernate.dialect.MySQL5Dialect但沒有幫助。

在我的註解回答實體類的LastModified列聲明如下

@Column 
private Date lastModified; 

public Date getLastModified() { 
    return lastModified; 
} 

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

任何想法?

+0

對使用​​Hibernate的列進行的任何更改都保存到數據庫中? –

+0

是的,但不是lastModified的當前時間戳值。 –

+0

如果上次修改的字段是一個時間戳,如果記錄更改,它將設置爲當前時間,那麼您不應該手動更新它,只檢索其值。如果您修改記錄,Mysql將更新此字段。 – Shadow

回答

3

正如@Shadow所提到的,您當前的模式設計意味着您希望MySQL爲您自動設置lastModified字段(on update CURRENT_TIMESTAMP)。所以如果你通過你的Java代碼中的null,那麼它應該按預期工作。嘗試使用在你的列定義的updatable = false選項告訴JPA不發送值到MySQL:

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

我的猜測,什麼是目前發生的是,休眠與值從數據庫填充lastModified場,然後你的JPA代碼然後堅持這個相同的值回到MySQL。所以看起來該值沒有被更新。但真正發生的是,您的JPA代碼使用相同的舊值進行更新。

+1

嗯,我明白了你的觀點。它現在按預期工作。謝謝@Tim。 –