javax.validation.constraints.NotNull强制ManyToOne相关字段的内部联接。我们能避免吗?

时间:2017-05-16 13:11:56

标签: hibernate jpa spring-data-jpa bean-validation

这与JPA实体中使用的JSR-303 NotNull验证约束有关。

我们观察到,当调用它的相应CRUD存储库的findOne(id)方法时,ManyToOne映射字段上的javax.validation.constraints.NotNull注释导致父实体的内连接,而不是左外连接。

有没有办法避免/覆盖这种默认行为?

我需要在每个地方都使用左外连接,即使我对ManyToOne映射使用@NotNull注释。

仅供参考,目前我使用sprint数据JPA作为我的JPA提供商。

1 个答案:

答案 0 :(得分:1)

您正在观察的是Hibernate ORM和Bean Validation集成的一部分。

此集成基本上采用Bean Validation注释,并且存在等效的ORM映射,它基本上确保ORM映射和Bean Validation映射是等效的。

举几个例子:

@NotNull将有效地建立一对一关联nullable = false @Size(max=500)实际上意味着@Column(length=500)

解决这个问题的一种方法是在这里分担责任。这是一种非常常见的情况,在这种情况下,您需要与稍微不同的语义共存。

不要将实体加倍作为持久对象和验证对象,而是使用DTO或值对象通过bean验证进行验证。您只需在业务域层中手动调用bean验证,如果有效,则在应用更改之前映射到持久对象。