JPA:数据库生成列

7

我在使用Hibernate和JPA时遇到了问题。我的要求是数据库中的列CreatedDTTMLastUPDATEDDTTM应该被填充。我已经尝试过以下方法,但没有用。我的列被设置为NOT NULL。我收到了一个“无法将Null插入LastUpdatedDttm”的异常。任何指导都将不胜感激。

@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;
1个回答

8

无法复现。我已在Derby上测试了以下实体:

@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
}

接下来的测试方法通过:

@Test
public void testDateGenerationWhenInsertingEntityWithNullDate() {
    EntityWithGeneratedField e = new EntityWithGeneratedField();
    session.persist(e);
    session.flush();
    assertNotNull(e.getId());
    assertNotNull(e.getLastUpdDTTM());
}

以下是生成的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层面。

谢谢你的回应。你说得对,我没有在DDL级别设置DEFAULT SYSDATE。但现在我遇到了另一个问题。我已经将LastUPdatedDttm的UPDATABLE设置为true,但它仍然不是由Hibernate生成的更新语句的一部分。我需要每次更新记录时将LastUpdateDDttm更新为SYSDATE。 - jpanewbie
@jpanewbie 你能把这个问题单独发表吗?在一个问题中不混合多个问题是最佳实践。谢谢。 - Pascal Thivent
@jpanewbie 你找到解决方案了吗? - Luigi Saggese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接