2010-05-06 146 views
6

我面臨着Hibernate和JPA的問題。我的要求是列CreatedDTTMLastUPDATEDDTTM應填充在數據庫級別。我試過以下但沒用。我的列被設置爲NOT NULL。我得到一個「不能插入Null到LastUpdatedDttm」異常。任何指導表示讚賞。JPA:數據庫生成列

@Column(name="LAST_UPDATED_DTTM", insertable=false, updatable=false, columnDefinition="Date default SYSDATE") 
@org.hibernate.annotations.Generated(value=GenerationTime.INSERT) 
@Temporal(javax.persistence.TemporalType.DATE) 
private Date lastUpdDTTM; 

@Column(name="CREATED_DTTM」, insertable=false, updatable=false) 
@org.hibernate.annotations.Generated(value=GenerationTime.ALWAYS) 
@Temporal(javax.persistence.TemporalType.DATE) 
private Date createdDTTM; 

回答

7

無法重現。我測試了以下實體上的德比:

@Entity 
public class EntityWithGeneratedField { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(name = "LAST_UPDATED_DTTM", insertable = false, updatable = false, 
      columnDefinition = "Date default CURRENT_DATE") 
    @org.hibernate.annotations.Generated(value = GenerationTime.INSERT) 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date lastUpdDTTM; 

    // getters, setters 
} 

和下面的測試方法傳遞:

下面,生成的SQL:

 
Hibernate: insert into EntityWithGeneratedField (id) values (?) 
Hibernate: select entitywith_.LAST_UPDATED_DTTM as LAST2_83_ from EntityWithGeneratedField entitywith_ where entitywith_.id=? 

一切工作正常。

我的建議:檢查你的表的DDL,檢查事情是否可以使用原始的SQL INSERT。我懷疑是數據庫級別的問題,而不是Hibernate級別的問題。

+0

感謝您的回覆。 YOu是正確的,我沒有在DDL級別設置DEFAULT SYSDATE。但現在我遇到了另一個問題。我爲LastUPdatedDttm設置了UPDATABLE = true,但它仍然不是由hibernate生成的更新語句的一部分。每次更新reocrd時,我需要通過SYSDATE更新LastUpdateDDttm。 – jpanewbie 2010-05-06 09:36:03

+0

@jpanewbie你可以把這作爲一個單獨的問題嗎?不要在單個問題中混合問題是最佳做法。謝謝。 – 2010-05-06 09:50:42

+0

完成。你現在可以幫忙嗎? – jpanewbie 2010-05-06 10:13:52