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

时间:2018-07-31 14:14:39

标签: java spring hibernate jpa

我们的某些实体声明与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时,它将因约束冲突而失败。

1 个答案:

答案 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会抛出此异常,而不是让数据库发现问题。