2013-04-26 57 views
0

我有以下的数据库列:尽管设置了默认值,但获取了非空错误。

`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 property references a null or transient value: com.fs.model.BrowserHistory.lastModified

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

+0

你确实设置了属性? Hibernate将在持续之前验证。你在表定义中定义了一个默认值并不重要。 – Bart 2013-04-26 14:31:55

+0

@Bart,不,它是一个数据库生成的属性,所以我不应该设置它。我想我在hibernate文档中找到了一个解决方案并发布了一个答案。 – Osman 2013-04-26 21:19:58

回答

0

我发现数据库中生成列需要一些特殊注解:

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

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

+0

它工作?如果是这样,你不需要我的答案在这里:) – kostja 2013-04-27 11:35:55

+0

仍在测试,但它似乎已解决了问题。奇怪的是,这个问题是零星的,不一致的,所以我想等一两天再打一个答案。 – Osman 2013-04-29 15:11:11

0

看起来像你想记录修改时间戳。为了避免人工设置(或不设置它,并得到错误),您可以使用生命周期回调:

@PrePersist 
public void updateTimestamps() { 
    lastModified = new Date(); 
} 
相关问题