首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@NotNull注释在模式生成中不会转换为NotNull约束

@NotNull注释在模式生成中不会转换为NotNull约束
EN

Stack Overflow用户
提问于 2018-07-10 05:54:53
回答 2查看 1.6K关注 0票数 4

根据hibernate验证器参考文档-第11.1.1节。数据库模式级验证 (single/#validator-checkconstraints-db),

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

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

我尝试将Environment.HBM2DDL_AUTO设置为updatecreate,但两者都无法生成数据库约束。

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

代码语言:javascript
复制
settings.put("hibernate.validator.apply_to_ddl", true);

但这些选择似乎都不适合我。

我的域类

代码语言:javascript
复制
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类

代码语言:javascript
复制
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;
}

我用来获取会话工厂的代码是

代码语言:javascript
复制
    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;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-08 05:08:38

这对我来说是一个愚蠢的错误,因为我没有将javax.el依赖项及其实现包含在pom.xml中。

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

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

因此,最后,通过添加下面的依赖项,我能够解决模式生成中的NoClassDefFoundError错误以及验证注释到数据库约束的非翻译问题。

代码语言:javascript
复制
    <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>
票数 2
EN

Stack Overflow用户

发布于 2018-07-10 08:52:29

您应该使用@列(nullable= false)

@NotNull用于Bean验证,而不是模式约束,如果使用的是hibernate的旧版本,@NotNull将不会转换为列约束

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51258073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档