这与JPA实体中使用的JSR-303 NotNull验证约束有关。
我们观察到,当调用它的相应CRUD存储库的findOne(id)方法时,ManyToOne映射字段上的javax.validation.constraints.NotNull注释导致父实体的内连接,而不是左外连接。
有没有办法避免/覆盖这种默认行为?
我需要在每个地方都使用左外连接,即使我对ManyToOne映射使用@NotNull注释。
仅供参考,目前我使用sprint数据JPA作为我的JPA提供商。
答案 0 :(得分:1)
您正在观察的是Hibernate ORM和Bean Validation集成的一部分。
此集成基本上采用Bean Validation注释,并且存在等效的ORM映射,它基本上确保ORM映射和Bean Validation映射是等效的。
举几个例子:
@NotNull
将有效地建立一对一关联nullable = false
@Size(max=500)
实际上意味着@Column(length=500)
。
解决这个问题的一种方法是在这里分担责任。这是一种非常常见的情况,在这种情况下,您需要与稍微不同的语义共存。
不要将实体加倍作为持久对象和验证对象,而是使用DTO或值对象通过bean验证进行验证。您只需在业务域层中手动调用bean验证,如果有效,则在应用更改之前映射到持久对象。