java - JPA MappedSuperClass 列不可为空

标签 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 将生成并更新架构(代码优先方法)。

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

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

最佳答案

您可以使用 @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;

}

关于java - JPA MappedSuperClass 列不可为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178924/

相关文章:

java - 如何更改不同类的字符串数组的值?

java - 你在哪里配置jboss6中的log4j设置

java - Android:文本淡入淡出

java - Hibernate HQL 问题期望找到 IDENT "*"

java - 使用 Spring JPA 规范和 Hibernate 加入不同的元素

java - 调用 session.save() 时非法尝试将代理与两个打开的 session 关联

java - hibernate 延迟加载不起作用

java - JPA JoinColumn 与mappedBy

java.lang.NoClassDefFoundError : Could not initialize class xxx. xxx.xxx.HibernateUtil

java - 在哪里锁定以进行实体行的原子获取或创建