2010-05-06 135 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