我必须在哪一边为这样的@OneToOne 关系定义@JoinColumn 注释?

On which side must I define a @JoinColumn annotation for a @OneToOne relationship like this?

假设我有类似 figure 1 的关系(客户和 AtmCard 之间的@OneToOne,一侧是强制性的,但另一侧不是)。

我是否正确地说,为了在 AtmCard 端强制执行客户的强制性方面,我需要像 figure 2 中那样定义一个 @JoinColumn(nullable = false) 以及我的 @OneToOne 注释?

如果我不定义此 @JoinColumn 注释并将 optional 设置为 false,会发生什么情况? @JoinColumn(nullable = false) 究竟做了什么,为什么我应该只将它应用于所有 @OneToOne 和 @ManyToOne 关系?

作为参考,figure 3 显示了我在客户端的注释映射。谢谢!

你会找到一个很好的解释here and in this tutorial

但通常您可以在您的实体中实现双向性(这意味着您可以执行 customer.getAtm() 或 atm.getCustomer())而不必在两个表中使用 FK 创建 2 列(JPA 将使用加入得到一些东西)。 您通常会在 child 实体 (ATM) 上添加 nullable false,因为没有客户就不能存在 ATM,但是没有 ATM 就可能存在客户(现实世界就是这种情况,除非您的业务不同那么你也应该将其强制为 parent)

我们通常添加这些类型以帮助我们保持数据库内容有效