我正在创建几个抽象类来抽象每个实体共享的属性,例如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将生成和更新架构(代码优先方法)。
我的问题是如何强制JPA/Hiberante在数据库中设置createdAt和lastModifiedAt非NULLABLE字段?
我知道我可以使用Java验证和Hibernate验证来防止应用程序插入空值,但我希望数据库也能执行它,以防有人决定手动插入数据库。
发布于 2015-03-21 03:40:17
您可以使用@Column注释来定义如何生成模式的元数据,该注释具有一些属性来定义如何创建该列--例如,可空属性指示列是否允许空值。
这些属性是特定于模式生成过程的,不能在运行时用作验证,正如您提到的,您可以使用BeanValidations。您可以检查@Column注释这里的所有属性
在您的示例中,您可以这样使用:
@MappedSuperclass
public abstract class AbstractAuditModel extends AbstractModel {
@CreatedDate
@Column(nullable = false)
protected Date createdAt;
@LastModifiedDate
@Column(nullable = false)
protected Date lastModifiedAt;
}https://stackoverflow.com/questions/29178924
复制相似问题