java - @NotNull 注释在模式生成中不会转换为非空约束
问题描述
根据休眠验证器参考文档 - 第11.1.1 节。数据库模式级验证(https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-checkconstraints-db),
开箱即用,Hibernate ORM 会将您为实体定义的约束转换为映射元数据。例如,如果您的实体的属性被注释为@NotNull,则其列将在 Hibernate ORM 生成的 DDL 模式中声明为非空。
但是当我用@NotNull 注释我的字段时,我没有自动获得架构级别的约束。
我尝试设置Environment.HBM2DDL_AUTO
为update
,create
但都没有生成数据库约束。
即使默认情况下休眠已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;
}
解决方案
您应该使用 @Column(nullable = false)
@NotNull 用于 Bean 验证,而不是模式约束,如果您使用的是旧版本的 hibernate,@NotNull 将不会被转换为列约束
推荐阅读
- postgresql - 如何将表分区到两列?
- mysql - 如何使用 dbplyr 连接到 mysql 数据库
- windows - 如何在 Windows 上将共享文件夹设置为 docker 容器 docker
- bash - 如何在bash中接受多个参数
- database - 如果稍后在程序中产生错误,我如何设计我的数据库以防止我的数据库更新?
- asp.net-mvc - ASP.NET MVC 无需任何 DI 代码即可解析具体类型
- ios - 为什么不能在 Swift 上的 Webview 中显示指标?
- python-3.x - pytorch collate_fn 拒绝样本并产生另一个
- javascript - React Navigation SwitchNavigator 的动态初始路由
- php - 根映射定义具有不受支持的参数: