当前位置: 首页 > 知识库问答 >
问题:

一对一Hibernate

景国兴
2023-03-14

我有示例代码来检查双向关系是如何工作的。

@Getter
@Setter
@NoArgsConstructor
@ToString
@Entity
public class A {
   @Id
   @GeneratedValue
   private long aId;
    String name;
    String address;
    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "b_id_FK")
    B b;
}

@Getter
@Setter
@NoArgsConstructor
@ToString
@Entity
public class B {
    @Id
    @GeneratedValue
    @Column(name = "b_id_PK")
    private long bId;
    private String name;
    private String address;
    @JoinColumn(name = "a_id", referencedColumnName = "aId")
    @OneToOne(mappedBy = "b", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    A a;
}

public void insertAB(){
    B b = new B();
    b.setName("B-Name");
    b.setAddress("B-Address");

    A a = new A();
    a.setName("A-Name");
    a.setAddress("A-Address");
    a.setB(b);
    b.setA(a);
    aRepository.save(a);
}

我可以看到这种表h2表:-

A:-

B:-

对于B表,我期待一个列a_id,正如我在代码中提到的。

所以我在我的控制器中,如果我试图检索B,如下所示:-

@GetMapping(value = "/getb/{id}")
public B getB(@PathVariable long id){
   var b =  bRepository.findById(id).get();
   return b;
}

{
"name": "B-Name",
"address": "B-Address",
"a": {
    "name": "A-Name",
    "address": "A-Address",
    "b": {
        "name": "B-Name",
        "address": "B-Address",
        "a": {
            "name": "A-Name",
            "address": "A-Address",
            "b": {
                "name": "B-Name",
                "address": "B-Address",
                "a": {
                    "name": "A-Name",
                    "address": "A-Address",
...........

它就像一条链条,一条链条,一条链条。我正在学习hibernate和表的关系。显然我误解了什么。我的目的是双向的,当我加载A时,我可以访问相关的B。同样,当我加载B时,我可以访问相关的A。我如何实现这个目标?

共有1个答案

施海
2023-03-14

A是关联的拥有方(由mappedBy属性指定),因此关联信息作为A表的一部分保留。实体B-作为非拥有方-在其表中不包含任何关联信息(并且不需要@JoinColumn注释)。

对于(JSON-)序列化,您可能希望注释一个实体关联属性,例如使用@JsonBackReference,以便在序列化时省略它并避免无限递归(请参阅https://stackoverflow.com/a/31319631).

 类似资料:
  • 问题内容: 我正在尝试在Hibernate中将一对一关系映射为“零或一个”关系。我想我可能已经找到了使用多对一方法。 A类的映射指定: B类的映射指定: 我想在数据库中找不到B的匹配行时b为null。所以我可以做到这一点(在A类中): 但是,看来b永远不会为空。 我该怎么办? 问题答案: 答案是在A中的多对一语句中添加not-found =“ ignore”: 我尝试按照Rob H的建议,简单地向

  • 一对一关联模型 满足条件:一个人只能对应一个身份证,一个身份证只能对应一个人 示例: student 学生表 card 身份证表 >[danger] 一对一可以在任意一个表添加外键 > 注意!!! 一对一外键需要添加 unique 唯一约束 反向关联 'use strict'; const moment = require('moment'); module.exports = app =&gt

  • null 但是在Eclipse中测试它之后,它渴望得到所有的东西。 是否取决于我使用的是JPA还是Hibernate?

  • 我有两个不同的表,Person表和Employee表。我需要这两者之间的一对一映射。Employee表的emp_id引用Person表的person_id。在使用注释编写映射方面我需要一些帮助

  • 我需要帮助在java类中为这些关系表创建映射Hibernate注释(一对一): 有人能帮我吗?谢谢你。

  • 问题内容: hibernate映射中的默认访存类型是什么? 探索之后我知道的是: 渴望 一对一。 对于一对多来说,这是 懒惰的 。 但是在Eclipse中对其进行测试后,它对所有人都非常渴望。 是否取决于我使用的是JPA还是Hibernate? 问题答案: 这取决于您使用的是JPA还是Hibernate。 根据JPA 2.0规范,默认值为: hibernate的时候,一切都是懒惰的 更新: 最新版