2010-05-06 14 views
1

我需要LastUpdatedDttm更新SYSDATE每当记录更新。但是低于预期值并不能按需要工作。 SYSDATE只插入一次,而不是为后续更新而更新。此外,lastUpdDTTM不是由hibernate生成的sql的一部分。可更新虚假行为incotictent

@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; 
+0

您正在使用哪种JPA实现?它可能有帮助。 – snowflake 2010-05-06 10:17:04

回答

0

(...)SYSDATE插入只有一次,而不是更新的后续更新。

首先,让我清楚的东西:Generated表示该字段是由数据库和Hibernate需要插入/更新后读取它来更新实体产生。在列定义中使用default SYSDATE对INSERT工作正常,但对于UPDATE,则需要触发器。

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

嗯,你告诉了Hibernate这个字段是由数据库生成ALWAYS所以我不surpised,Hibernate并不包括在生成的SQL(实际上,我认为,这在某种程度上与udpatable = true冲突,我希望Hibernate抱怨它)。

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


一种不同的方法是使用回调的注解,例如最后更新日期:

@PreUpdate 
protected void updateDates() { 
    lastUpdDTTM = new Date(); 
} 

为了更好的一致性,你甚至可以使用的创建日期相同的方法与@PrePersit

@PrePersist 
@PreUpdate 
protected void updateDates() { 
    Date now = new Date(); 
    if (createdDTTM == null) { 
     createdDTTM = new Date(now.getTime()); 
    } 
    lastUpdDTTM = now; 
} 
+0

再次感谢。但我真的不想使用触发器。有没有其他解决方案? – jpanewbie 2010-05-06 10:38:32

+0

我希望我可以使用回调。它需要DB服务器日期时间。这种方法会给我的Web服务器当前时间。 – jpanewbie 2010-05-06 11:03:38

+0

@jpanewbie的确。最后的想法是:在更新日期也使用'default SYSDATE',并在'@ PreUpdate'方法中将更新日期设置为'null'。 – 2010-05-06 11:15:18