【问题标题】:What is the difference between @ManyToOne(optional=false) vs. @Column(nullable=false)@ManyToOne(optional=false) 与 @Column(nullable=false) 有什么区别
【发布时间】:2011-03-20 21:38:54
【问题描述】:

在 JPA 中,我对何时使用属性 optional=false 和注释 @Column(nullable=false) 感到困惑。有什么区别?

【问题讨论】:

标签: java hibernate orm jpa


【解决方案1】:

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

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

【讨论】:

  • 另一个有趣的事实是,大多数持久性提供程序使用“可选”参数提供的信息来优化运行时的查询。例如在加载实体时。因此,使用 optional=false 指定的实际实体的所有关系在加载时都会导致与其各自关系的 INNER JOIN,而使用 optional=true 指定的关系会导致 LEFT JOIN。
【解决方案2】:

Both 用于防止 null 值,但如果您介意 null 应该被阻止在 ...

database 层(并且您想使用 JPA 生成模式)--> 使用 @Column(nullable=false)

运行时(在联系数据库之前)--> 使用optional=false(比第一次检查快得多)。

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

【讨论】:

  • Affe 已经解决了运行时事实:“optional=false 是运行时指令。”
猜你喜欢
  • 2011-02-23
  • 1970-01-01
  • 2013-02-17
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2011-11-18
相关资源
最近更新 更多