【问题标题】:Getting not-null errors despite having a default value set.尽管设置了默认值,但仍出现非空错误。
【发布时间】:2013-04-26 14:17:44
【问题描述】:

我有以下数据库列:

 `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

在hibernate中有如下映射:

@Temporal(TemporalType.TIMESTAMP)
@Column(name="last_modified", nullable=false, length=19)
public Date getLastModified() {
    return this.lastModified;
}

这几个月来一直运行良好,但突然间我收到以下错误:

javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null 属性引用空值或瞬态值:com.fs.model.BrowserHistory.lastModified

所以我想知道,为什么会突然发生这种情况?如果我将 lastModified 字段设置为可为空,是否可以?

【问题讨论】:

  • 你真的设置了属性吗? Hibernate 将在持久化之前进行验证。您在表定义中定义默认值无关紧要。
  • @Bart,不,它是数据库生成的属性,所以我不应该设置它。我想我在休眠文档中找到了解决方案并发布了答案。

标签: spring hibernate


【解决方案1】:

您似乎想记录修改时间戳。为避免手动设置(或不设置并出现错误),您可以使用生命周期回调:

@PrePersist
public void updateTimestamps() {
    lastModified = new Date();
}

【讨论】:

    【解决方案2】:

    我发现数据库生成的列需要一些特定的注释:

    @Column(name="last_modified", nullable=false, length=19, insertable=false, updatable=false)
    @Generated(GenerationTime.ALWAYS)
    

    我们现在正在尝试这个,但我认为它会解决问题。

    【讨论】:

    • 仍在测试中,但似乎已经解决了问题。奇怪的是这个问题是零星的而且不一致,所以我想等一两天再标记答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多