Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果不用于DDL生成,Hibernate@JoinColumn(nullable=false)是否冗余?_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java 如果不用于DDL生成,Hibernate@JoinColumn(nullable=false)是否冗余?

Java 如果不用于DDL生成,Hibernate@JoinColumn(nullable=false)是否冗余?,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我们的一些实体声明与nullable=false @OneToMany @JoinColumn(name = "FK_ID", referencedColumnName = "ID", nullable = false) private List<Things> manyThings; @OneToMany @JoinColumn(name=“FK_ID”,referencedColumnName=“ID”,nullable=false) 私人清单; 我们使用Flyway进行DD

我们的一些实体声明与
nullable=false

@OneToMany
@JoinColumn(name = "FK_ID", referencedColumnName = "ID", nullable = false)
private List<Things> manyThings;
@OneToMany
@JoinColumn(name=“FK_ID”,referencedColumnName=“ID”,nullable=false)
私人清单;
我们使用Flyway进行DDL。我在许多资料中读到,
JoinColumn
属性
nullable
仅用于DDL生成-因此我是否正确理解,当我们的Flyway脚本直接在DB上生成带有约束的表时,实体上的
nullable=false
属性是多余的?DDL生成的确切含义是什么?Hibernate在这方面提供了什么


我遇到这个问题是因为在一些表上,DB列上的约束是
Non-Null=true
,而在Java实体上设置了属性
nullable=false
。这似乎对运行时的应用程序没有任何影响;它很乐意插入
null
值。但是,当运行SpringBootTest时,它会因约束冲突而失败。

这不仅适用于DDL生成,也适用于Hibernate验证注释

当您说nullable=false时,JPA会生成数据库约束(非null),并且还会生成一个不允许您在运行时nullable=false列为null时持久化实体的约束。因此,当您编写nullable=false时,JPA以一个特性的价格生成这两个特性@Column(nullable=false)是JPA将列声明为非null的方法

如果nullable=false,则以下保存将失败:

ObjectThatContainsListThings a = new ObjectThatContainsListThings();
a.setListOfThings(null)

hibernate.persist(a);
DataIntegrityViolationException: not-null property references a null or transient value   

JPA将抛出此异常,而不是让数据库发现问题。

听起来您在一种情况下使用的是现有数据库,在第二种情况下使用的是测试或内存中的数据库,如H2DB。在第二种情况下,将生成DDL,并在每次运行时创建数据库。您应该知道什么是数据库DDL。Hibernate EntityManager具有生成文件DDL的例程,或者您可以在SpringBootTest中打开“显示SQL”并查看正在创建和应用的DDL。否,在这两种情况下,我们都使用Oracle数据库。在这两种情况下,Flyway都在创建表。嘿,enp4yne,有什么更新吗?我下面的回答对你有帮助吗?