当前位置: 首页 > 面试题库 >

具有一对一关系的JPA @JoinColumn批注

拓拔安邦
2023-03-14
问题内容

是否可以在JPA的一对一关系的两边使用@JoinColumn?我的印象是,应该始终在一对一关系的拥有方中使用它,因为拥有方将具有外键列,并且此注释定义了外键列的属性。请说明我的理解是否正确。

编辑#1- 我想知道,在哪种情况下我们将在一对一关系的两边都使用@JoinColumn批注?


问题答案:

OneToOne关系不一定是双向的。当在源对象和目标对象中都存在对该关系的另一个对象的引用时,就会发生双向OneToOne关系。

在双向OneToOne关系中,在关系的拥有方使用单个外键。另一方面,目标实体必须使用 mappedBy 属性。

  • 例:

让我们考虑 播放器网站 对象之间的OneToOne关系。

每个玩家实体仅对应一个网站实体:

@Entity
public class Player {
  @Id
  @Column(name="PLAYER_ID")
  private long id;
  ...
  @OneToOne
  @JoinColumn(name="WEBSITE_ID")
  private Website website;
  ...
}

如果我们向网站实体添加mappedBy选项,则OneToOne单向关联将转换为双向关联:

@Entity
public class Website {
  @Id
  @Column(name = "WEBSITE_ID")
  private long id;
  ...
  @OneToOne(mappedBy="website")
  private Player websiteOwner;
  ...
}

您可以参考这个链接,这一个以获取更多信息。



 类似资料:
  • 我有一个实体: 要创建上述实体并将其保存到JPA存储库中,我将执行以下操作: 由于DB中的表存储了候选对象的FK,我认为设置一个id就足够了。但JPA希望我设置候选对象。这迫使我查询候选存储库。 是否需要从候选库中查询候选人以保存,或者如果我有可用的候选人id,我不能直接设置它?

  • 问题内容: 我有一对一的关系,但是hibernatetool在生成模式时抱怨。这是显示问题的示例: 人与OtherInfo具有一对一关系: 人是OtherInfo的拥有方。OtherInfo是拥有方,因此person用于在Person中指定属性名称“ otherInfo”。 使用hibernatetool生成数据库架构时出现以下错误: 知道为什么吗?我是在做错什么还是这是Hibernate错误?

  • 我有一个JPA实体(人)与其他实体(地址)有多对一的关系。在一个对象可以被系统使用之前,这个对象必须得到主管的批准。我将原始实体存储为byte[]并对“工作”实体进行更改,并将其存储在数据库中。如果这些更改不被批准,我必须恢复原始状态。因此,我将存储的原始数据从byte[]中转换出来,并使用实体管理器将其合并到数据库中。所有的工作都很好,但是如果一个新的地址实体已经添加到“工作”的人,在合并还原的

  • 问题内容: 我在Hibernate中具有以下一对一关系(可能为null): 我正在尝试使用HQL选择所有具有非空详细信息的实体: 但这会返回所有实体,无论详细信息是否为空。 那么正确的HQL是什么? 问题答案: 好的,我找到了解决方案:

  • 我的两个实体有一对一的关系 我尝试通过此方法删除我的用户实体 PasswordResetTokenRepository类,我在服务方法中调用了该类,用于删除用户,我使用了常规Hibernate方法deleteById(Long id) 但是当我尝试通过此方法删除时,出现此错误:not-null 属性引用 null 或瞬态值:kpi.diploma.ovcharenko.entity.user.Pa

  • 我在数据库中有两个表一对一的关系: 我必须使用来编写Java实体类: 客户端类: 占有实体: 我有一个klientMB,它添加了人和地址 但是当我尝试添加一个Klient时,我出现了这个错误: