我正在创建一些抽象类来抽象我的每个实体将共享的属性,例如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验证来阻止应用程序插入空值,但我希望数据库强制执行它,以及某人决定手动插入数据库。
答案 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;
}