可更新的错误列正在更新

时间:2014-06-06 09:44:26

标签: java hibernate

我的表格中有一个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=?

3 个答案:

答案 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