@ManyToOne(可选= false)与@Column(nullable = false)之间的区别是什么?

Tru*_* Ha 53 java orm hibernate jpa

在JPA中,我很困惑何时使用属性optional=false和注释@Column(nullable=false).有什么不同?

Aff*_*ffe 88

@Column(nullable=false)是用于生成模式的指令.在类外生成的数据库列将在实际数据库中标记为不可为空.

optional=false是一个运行时指令.它所做的主要功能与延迟加载有关.你不能延迟加载一个非集合映射的实体,除非你记得设置optional = false(因为Hibernate不知道那里应该有代理还是null,除非你告诉它null是不可能的,所以它可以生成代理人.)

  • 另一个有趣的事实是,大多数持久性提供程序使用"可选"参数提供的信息来在运行时优化查询.例如,在加载实体时.因此,使用optional = false指定的实际实体的所有关系在加载时导致INNER JOIN到它们各自的关系,而使用optional = true指定的关系导致LEFT JOIN. (23认同)

O.B*_*adr 7

两者都用于防止空值,但如果您介意应该在 ...

数据库层(你想生成使用JPA的模式) - >使用@Column(nullable=false)

运行时(和数据库接触之前) - >使用optional=false(比第一检查快得多)。

如果您想要这两种能力,请同时使用它们。