可更新的错误行为不一致

时间:2010-05-06 10:11:46

标签: java hibernate orm jpa

每当记录更新时,我都需要通过SYSDATE更新LastUpdatedDttm。但是,在annoataions下面没有按照需要工作。 SYSDATE仅插入一次,并且不会更新以用于后续更新。另外,lastUpdDTTM不是hibernate生成的sql的一部分。

@Generated(GenerationTime.ALWAYS)
@Column(name="LAST_UPDATED_DTTM",insertable=false,updatable=true, columnDefinition ="timestamp default SYSDATE")
private Date lastUpdDTTM;

@Generated(GenerationTime.ALWAYS)
@Column(name="CREATED_DTTM", insertable=false, updatable=false)
private Date createdDTTM;

1 个答案:

答案 0 :(得分:0)

  

(...)SYSDATE只插入一次,不会更新以供后续更新。

首先,让我说清楚一点:Generated表示该字段由数据库生成 ,并且Hibernate需要在插入/更新后读取它以更新实体。在列定义中使用default SYSDATE适用于INSERT,但对于UPDATE,您需要一个触发器。

  

此外,lastUpdDTTM不是hibernate生成的sql的一部分。

好吧,你告诉Hibernate这个字段是ALWAYS由数据库生成的,所以我并不觉得Hibernate不会在生成的SQL中包含它(实际上,我认为这与{{{ 1}},我希望Hibernate能够抱怨它。​​)

无论如何,正如我所说,不是Hibernate会更新这个字段,它是数据库而你需要一个触发器,Hibernate只会在更新后刷新实体以获取新值。


另一种方法是使用回调注释,例如上次更新日期:

udpatable = true

为了更好的一致性,您甚至可以使用@PreUpdate protected void updateDates() { lastUpdDTTM = new Date(); } 创建日期使用相同的方法:

@PrePersit