【问题标题】:JPA: Database Generated columnsJPA:数据库生成的列
【发布时间】:2010-05-06 07:53:33
【问题描述】:

我遇到了 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;

【问题讨论】:

    标签: java hibernate orm jpa


    【解决方案1】:

    无法复制。我在 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:插入 EntityWithGeneratedField (id) 值 (?) Hibernate:从 EntityWithGeneratedField entitywith_ where entitywith_.id= 中选择 entitywith_.LAST_UPDATED_DTTM 作为 LAST2_83_

    一切都按预期工作。

    我的建议:检查表的 DDL,检查是否可以使用原始 SQL INSERT。我怀疑是数据库级别的问题,而不是 Hibernate 级别的问题。

    【讨论】:

    • 感谢您的回复。你是对的,我没有在 DDL 级别设置 DEFAULT SYSDATE。但是现在我遇到了另一个问题。我为 LastUPdatedDttm 设置了 UPDATABLE = true 但它仍然不是休眠生成的更新语句的一部分。每当更新 reocrd 时,我都需要由 SYSDATE 更新 LastUpdateDDttm。
    • @jpanewbie 你能把这个作为一个单独的问题发布吗?最好不要在一个问题中混合问题。谢谢。
    • @jpanewbie 你找到解决方案了吗?
    猜你喜欢
    • 2020-04-02
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2011-08-15
    相关资源
    最近更新 更多