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



我们的一些实体声明OneToMany/OneToOnenullable = false的关系

@OneToMany
@JoinColumn(name = "FK_ID", referencedColumnName = "ID", nullable = false)
private List<Things> manyThings;

我们将Flyway用于DDL。我在很多资料中读到,JoinColumn属性nullable仅用于DDL生成,所以我是否正确理解,当我们的Flyway脚本直接在DB上生成带有约束的表时,实体上的nullable = false属性是多余的?DDL生成究竟意味着什么?Hibernate在这方面提供了什么?

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

它不仅用于DDL生成,还用于Hibernate验证注释。

当您说nullable=false时,JPA会生成数据库约束(而不是null(,并生成JSR303Bean验证,如果nullable=false列在Runtime中为null,则该验证不允许您持久化实体。因此,当您编写nullable=false时,JPA会以一个的价格生成这两个特性@Column(nullable=false(是声明列不为null的JPA方法。

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

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

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

相关内容

最新更新