我的表格中有一个createdAt
列,我不希望在首次创建后更新。因此我在其定义中标记了updatable=false
。但是当我使用hibernate的更新方法时,它会得到更新。当我检查hibernate更新查询日志时,我看到createdAt字段未包含在更新查询中,但无论如何都会更新。这是我正在使用的代码(我使用hibernate 4)
- EDIT--
我使用mysql作为数据库,显然mysql workbench默认情况下将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);
}
Hibernate Log不包含createdAt
字段
update
example_schema.Users
set
lastLogin=?,
lastNotifiedAt=?,
userName=?,
waitingSince=?
where
userId=?
答案 0 :(得分:0)
这应该是通常的问题,其中您注释了属性,而不是字段,或相反。如果你的类没有附加注释,你应该保持一致,你只需要注释你的getters(属性)或字段(类变量)。
答案 1 :(得分:0)
我使用mysql作为数据库,显然mysql workbench默认情况下将CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
属性添加到timestamp列。删除ON UPDATE CURRENT_TIMESTAMP
属性后,问题就解决了。
答案 2 :(得分:-1)
您必须从created_at列中删除ON UPDATE CURRENT_TIMESTAMP
属性。
ALTER TABLE `DATABASE_NAME`.`TABLE_NAME` CHANGE `create_at` `create_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP