JPA MappedSuperClass列不可为空

时间:2015-03-21 03:31:29

标签: java hibernate jpa

我正在创建一些抽象类来抽象我的每个实体将共享的属性,例如ID。

我创建了一个如下所示的AbstractModel类。

import javax.persistence.*;
import java.io.Serializable;

@MappedSuperclass
public abstract class AbstractModel implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    protected Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public abstract int hashCode();

    @Override
    public abstract boolean equals(Object obj);

    @Override
    public abstract String toString();
}

我使用扩展AbstractModel创建了另一个抽象类,以添加一些审核信息,例如创建日期和上次修改日期。

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;

import javax.persistence.MappedSuperclass;
import java.util.Date;

@MappedSuperclass
public abstract class AbstractAuditModel extends AbstractModel {

    @CreatedDate
    protected Date createdAt;

    @LastModifiedDate
    protected Date lastModifiedAt;

    @Override
    public abstract int hashCode();

    @Override
    public abstract boolean equals(Object obj);

    @Override
    public abstract String toString();
}

我使用JPA / Hibernate创建数据库。没有物理数据库,Hibernate将生成和更新模式(Code First方法)。

我的问题是如何强制JPA / Hiberante在数据库中创建createdAt和lastModifiedAt NON NULLABLE字段?

我知道我可以使用Java验证和Hibernate验证来阻止应用程序插入空值,但我希望数据库强制执行它,以及某人决定手动插入数据库。

1 个答案:

答案 0 :(得分:0)

您可以使用@Column注释来定义如何生成模式的元数据,注释具有一些属性来定义如何创建列,例如,nullable属性指示列是否不允许空值。

这些属性特定于模式生成过程,并且在运行时不作为验证,因为您提到可以使用BeanValidations。您可以检查@Column注释here

的所有属性

在您的示例中,您可以这样使用:

@MappedSuperclass
public abstract class AbstractAuditModel extends AbstractModel {

    @CreatedDate
    @Column(nullable = false)
    protected Date createdAt;

    @LastModifiedDate
    @Column(nullable = false)
    protected Date lastModifiedAt;

}