Hibernate JPA OneToOne与外键的关系

问题描述 投票:2回答:2

我想在两个实体(也是mysql中的表)之间创建一个OneToOne关系。当我收到帖子请求时,我想保存A实体,然后自动保存B实体,因为B(“a_id”)中有一列是A(“id_a”)中主键的外键。我如何映射他们的纠正?

@Table("a_tb")
public class A(){
    @Column(name="id_a")
    private Long idA;
    @OneToOne(mappedBy = "aId", cascade = CascadeType.ALL,
        fetch = FetchType.LAZY, orphanRemoval = true, optional = false)
    private B b;
}
@Table("b_tb")
public class B(){
    @Column(name="id_b")
    private Long idB;
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private Long aId;
}

试图将idA设置为A类型,但是当我调用get方法时,他将循环调用A,其中B作为A innested等等,我只想在A中保存A的id,而不是整个对象,否则,当我调用get方法并返回循环时,他将返回整个对象。映射是正确的,而不是B中a_id中值的自动设置。

我期望的是:当我创建A时,当我请求保存对象A时,B自动获取A的id并将其保存到db中的列(“id_a”)。这也应该与delete一起使用(当我删除A时, B也被删除了)。匹配的JSON将是:

{
 "a":{
      "id_a": "value",
     },
 "b":{
      "id_b": "value",
      "a_id": "id_a"
     }
 }

谢谢你的建议。

java hibernate one-to-one
2个回答
0
投票

从第一眼看起来像

@OneToOne
@JoinColumn(name = "idA_id")
A a; 

将是你需要的改变


0
投票

您需要在两个类中提供一对一映射[Reference]。如果父引用未自动设置,则可以创建瞬态变量并使用它设置父级主键。

试试这个例子:

@Table("a_tb")
    public class A(){
        @Column(name="id")
        private Long id;
        @OneToOne(mappedBy = "aId", cascade = CascadeType.ALL,
            fetch = FetchType.LAZY, orphanRemoval = true, optional = false)
        private B b;
    }

    @Table("b_tb")
    public class B(){
        @Column(name="id")
        private Long id;
        @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "a_id")
        private A a;

        @Transient
        private Long aId;

        // getters and setters

        public void setAId(Long aId){
            if(aId != null){ 
               this.a = new A();
               this.a.setId(aId);
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.