我们的某些实体声明与OneToMany
的{{1}} / OneToOne
关系
nullable = false
我们将Flyway用于DDL。我在许多资料中都读到@OneToMany
@JoinColumn(name = "FK_ID", referencedColumnName = "ID", nullable = false)
private List<Things> manyThings;
属性JoinColumn
仅用于DDL生成-所以我正确理解,当我们的Flyway脚本直接在数据库上生成带有约束的表时,{{1} }我们实体上的属性是否多余? DDL-Generation的确切含义是什么?Hibernate在这方面提供什么?
我遇到了这个问题,因为事实证明,在某些表上,对DB列的约束是nullable
,而在Java实体上,则设置了属性nullable = false
。这似乎对运行时的应用程序没有任何影响。它将很高兴地插入Non-Null = true
值。但是,当运行SpringBootTest时,它将因约束冲突而失败。
答案 0 :(得分:1)
它不仅用于DDL生成,而且还用于Hibernate验证批注。
当您说 nullable = false 时,JPA会生成数据库约束(非null),并且ALSO会生成JSR 303 Bean Validation,如果 nullable则不允许您持久化实体= false 列在运行系统中为null。因此,当您编写 nullable = false 时,JPA会以一个价格生成这两个功能。 @Column(nullable = false)是JPA声明列不为空的方法。
如果nullable = false,则以下保存将失败:
ObjectThatContainsListThings a = new ObjectThatContainsListThings();
a.setListOfThings(null)
hibernate.persist(a);
DataIntegrityViolationException: not-null property references a null or transient value
JPA会抛出此异常,而不是让数据库发现问题。