我有示例代碼來檢查雙向關系如何作業。
@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 表:-
一個:-

乙:-

對于 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",
...........
它就像A鏈和B鏈一樣。我正在學習休眠和表關系。顯然我誤解了一些東西。我的意圖是雙向的,當我加載 A 時,我可以訪問相關的 B。此外,當我加載 B 時,我可以訪問相關的 A。我怎樣才能實作這個目標?
uj5u.com熱心網友回復:
A是關聯的擁有方(由mappedBy屬性指定),因此關聯資訊作為A表的一部分保留。物體B- 作為非擁有方- 在其表中不包含任何關聯資訊(并且不需要@JoinColumn注釋)。
對于(JSON-)序列化,您可能希望注釋物體關聯屬性之一,例如用@JsonBackReference,以便在序列化時省略它并避免無限遞回(參見 https://stackoverflow.com/a/31319631)。
uj5u.com熱心網友回復:
對于雙向一對一關系,這種注釋對我有用:-
@Getter
@Setter
@NoArgsConstructor
@ToString
@Entity
public class A {
@Id
@GeneratedValue
private long aId;
String name;
String address;
@JsonManagedReference // this for parent to avoid infinite recursion
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "b_id_FK") // B table foreign key in A table
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;
@NotNull
@JsonBackReference // this for child to avoid infinite recursion
@JoinColumn(name = "a_id_FK") // A table foreign key in B table
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private A a;
}
這樣我就可以在 A 和 B 表中都有外鍵。所以我可以雙向訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/408631.html
標籤:
