2014-06-06 45 views
1

我在我的表中有一個createdAt列,我不想在第一次創建後更新它。因此我在其定義中標記爲updatable=false。但是,當我使用hibernate的更新方法時,它正在更新。當我檢查hibernate更新查詢日誌時,我發現createdAt字段未包含在更新查詢中,但它仍會被更新。這裏是我使用的代碼(我使用休眠4)可更新錯誤列正在更新

- EDIT-- 我使用mysql作爲數據庫,顯然mysql工作臺添加CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP屬性默認爲timestamp列。通過hibernate刪除ON UPDATE CURRENT_TIMESTAMP更新問題得到解決。

這裏是列定義

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "createdAt", nullable = false, length = 19, updatable = false) 
public Date getCreatedAt() { 
    return createdAt; 
} 

這裏是更新方法:

Session session = null; 
try { 
    session = currentSession(); 
    session.beginTransaction(); 
    session.update(user); 
    commitTransactionOfGivenSession(session); 
} catch (HibernateException exc) { 
    logRollbackAndThrowHibernateException(exc, session); 
} finally { 
    closeSession(session); 
} 

休眠登錄其不包括createdAt字段

update 
    example_schema.Users 
set 
    lastLogin=?, 
    lastNotifiedAt=?, 
    userName=?, 
    waitingSince=? 
where 
    userId=? 
+0

什麼DBMS,以及如何在數據庫上定義列?是否有任何會導致列更新的表上的觸發器? – DaveH

+0

我正在使用mysql並將字段定義爲TIMESTAMP。現在我看到有一個默認值是由mysql「CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP」自動生成的。我試圖刪除這個,但MySQL似乎忽略了我的改變。 – cubbuk

回答

0

我使用mysql作爲數據庫,顯然mysql工作臺默認爲timestamp列添加CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP屬性。刪除ON UPDATE CURRENT_TIMESTAMP屬性後,問題得到解決。

0

它應該是通常的問題,其中你註解了該屬性,而不是字段,或相反。如果你的類沒有附加註釋,你應該保持一致,你只需要註解你的getter(屬性)或者字段(類變量)。

-1

您必須從created_at列中移除ON UPDATE CURRENT_TIMESTAMP屬性。

ALTER TABLE `DATABASE_NAME`.`TABLE_NAME` CHANGE `create_at` `create_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP