我们的一些实体声明OneToMany
/OneToOne
与nullable = 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将抛出此异常,而不是让数据库发现问题。