簡體   English   中英

帶有外鍵的Hibernate JPA OneToOne關系

[英]Hibernate JPA OneToOne Relationship with a foreign key

我想在兩個實體(也是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,以此類推。等等。我只想將A的ID保存在B中,而不是整個對象中,否則,當我調用get方法並且循環返回時,他將返回整個對象。 映射正確,而不是B中a_id中值的自動設置。

我期望的是:當我創建A時,B會自動獲取A的ID並在我請求保存對象A時將其保存到db中的列(“ id_a”)中。這也應該與delete一起使用(當我刪除A時, B也被刪除)。 匹配的JSON將是:

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

感謝您的建議。

從最初的樣子

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

將是您需要的更改,

您需要在兩個類中提供一對一的映射[參考]。 如果是父引用,則不是自動設置,您可以創建一個臨時變量並使用它來設置父的主鍵。

試試這個例子:

@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);
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM