Java @NotNull注释不会在架构生成中转换为NotNull约束

Java @NotNull注释不会在架构生成中转换为NotNull约束,java,hibernate,hibernate-validator,hibernate-5.x,mysql-5.5,Java,Hibernate,Hibernate Validator,Hibernate 5.x,Mysql 5.5,根据hibernate验证器参考文档-第11.1.1节。数据库架构级验证() 开箱即用,Hibernate ORM将转换您的约束 为实体定义的映射元数据。例如,如果 实体的属性被注释为@NotNull,其列将为 在Hibernate ORM生成的DDL模式中声明为NOTNULL 但是当我用@NotNull注释我的字段时,我并没有自动获得模式级别的约束 我尝试将Environment.HBM2DDL\u AUTO设置为update和create,但两者都无法生成数据库约束 即使hibernate默

根据hibernate验证器参考文档-第11.1.1节。数据库架构级验证()

开箱即用,Hibernate ORM将转换您的约束 为实体定义的映射元数据。例如,如果 实体的属性被注释为@NotNull,其列将为 在Hibernate ORM生成的DDL模式中声明为NOTNULL

但是当我用@NotNull注释我的字段时,我并没有自动获得模式级别的约束

我尝试将
Environment.HBM2DDL\u AUTO
设置为
update
create
,但两者都无法生成数据库约束

即使hibernate默认将
hibernate.validator.apply_to_ddl
设置为
true
,我甚至尝试手动设置-

settings.put("hibernate.validator.apply_to_ddl", true);
但这些选择似乎都不适合我

我的域类

package com.praveen.domain;

import javax.persistence.Entity;
import javax.validation.constraints.NotNull;

import lombok.Data;

@Entity
@Data
public class Stakeholder extends MyPersistent {

    @NotNull
    private String clientCode;

    @NotNull
    private String gender;
}
MyPersistent类

package com.praveen.domain;

import java.io.Serializable;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

import lombok.Getter;
import lombok.Setter;

@MappedSuperclass
@Getter
@Setter
public class MyPersistent implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}
我用来获取会话工厂的代码是

    private static SessionFactory getSessionFactory() {
        if (sessionFactory == null) {
            try {
                StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder();

                Map<String, Object> settings = new HashMap<>();
                settings.put(Environment.DRIVER, Driver.class.getName());
                settings.put(Environment.URL, "jdbc:mysql://localhost:3306/hibernate_test?"
                        + "zeroDateTimeBehavior=CONVERT_TO_NULL&"
                        + "createDatabaseIfNotExist=true&"
                        + "useSSL=true&"
                        + "verifyServerCertificate=false&"
                        + "autoReconnect=true");
                settings.put(Environment.USER, "root");
                settings.put(Environment.PASS, "");
                settings.put(Environment.DIALECT, MySQL55Dialect.class);
                settings.put(Environment.HBM2DDL_AUTO, "update");
                settings.put(Environment.SHOW_SQL, false);

                // HikariCP settings
                settings.put("hibernate.hikari.connectionTimeout", "20000");
                settings.put("hibernate.hikari.minimumIdle", "5");
                settings.put("hibernate.hikari.maximumPoolSize", "20");
                settings.put("hibernate.hikari.idleTimeout", "300000");

                registryBuilder.applySettings(settings);
                registry = registryBuilder.build();
                MetadataSources sources = new MetadataSources(registry);
                sources.addAnnotatedClass(Stakeholder.class);

                Metadata metadata = sources.getMetadataBuilder().build();
                sessionFactory = metadata.getSessionFactoryBuilder().build();
            } catch (Exception e) {
                e.printStackTrace();
                shutdown();
            }
        }
        return sessionFactory;
    }
private静态SessionFactory getSessionFactory(){
if(sessionFactory==null){
试一试{
StandardServiceRegistryBuilder registryBuilder=新的StandardServiceRegistryBuilder();
映射设置=新建HashMap();
settings.put(Environment.DRIVER、DRIVER.class.getName());
settings.put(Environment.URL,“jdbc:mysql://localhost:3306/hibernate_test?"
+“zeroDateTimeBehavior=将\u转换为\u NULL&”
+“createDatabaseIfNotExist=true&”
+“useSSL=true&”
+“verifyServerCertificate=false&”
+“自动恢复连接=真”);
settings.put(Environment.USER,“root”);
settings.put(Environment.PASS,“”);
settings.put(Environment.dialogue、mysql55dialogue.class);
settings.put(Environment.HBM2DDL_AUTO,“update”);
settings.put(Environment.SHOW\u SQL,false);
//HikariCP设置
settings.put(“hibernate.hikari.connectionTimeout”,“20000”);
设置.put(“hibernate.hikari.minimumIdle”,“5”);
settings.put(“hibernate.hikari.maximumPoolSize”,“20”);
settings.put(“hibernate.hikari.idleTimeout”,“300000”);
registryBuilder.applySettings(设置);
registry=registryBuilder.build();
MetadataSources sources=新的MetadataSources(注册表);
sources.addAnnotatedClass(涉众.class);
元数据=sources.getMetadataBuilder().build();
sessionFactory=metadata.getSessionFactoryBuilder().build();
}捕获(例外e){
e、 printStackTrace();
关机();
}
}
返回工厂;
}
您应该使用 @列(nullable=false)


@NotNull用于Bean验证,而不是模式约束,如果您使用的是较旧版本的hibernate@NotNull将不会转换为列约束,这对我来说是一个愚蠢的错误,因为我没有在pom.xml中包含
javax.el
依赖项及其实现

有趣的是,我当时没有得到
java.lang.NoClassDefFoundError:javax/el/ELManager
错误,因为我没有编写任何代码来通过
Validation.buildDefaultValidatorFactory()
初始化
ValidatorFactory

当我编写代码并使用
ValidatorFactory
时,我得到了
NoClassDefFoundError
,发现我缺少了
javax.el
依赖项

因此,通过添加以下依赖项,我终于能够解决
NoClassDefFoundError
错误以及模式生成中数据库约束的验证注释的非转换问题

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.0</version>
    </dependency>

javax.el
javax.el-api
3.0.0
玻璃鱼
javax.el
3.0.0

@Kayaman,在我发布我自己的帖子之前,我提到了那篇帖子,它清楚地指出“由于Hibernate是JSR303的参考实现,但是,它智能地提取了这些约束,并将它们转换为数据库约束,因此您可以用一个的价格获得两个”。但出于某种原因,我不知道为什么,我想问的是,在这种情况下,你是从一个空白数据库创建一个新的模式,或者您正在尝试让Hibernate将约束应用于现有模式?我尝试了这两种方案,但结果是sameI使用了最新的稳定版本:-Hibernate core-5.3.1 Hibernate validator-6.0.10 javax.persistence-api-2.2 validation-api-2.0.1可能无论如何都值得尝试缩小问题的范围