我目前正在撰寫一個專案,這需要我在兩個物體之間進行映射:一個帳戶和一個成員。一個帳戶可以有多個成員,而一個成員只能有一個帳戶。
在我完成雙向編碼后,一切正常,我得到了我想要的回應,只有成員。
從這里開始,問題開始了:
我開始撰寫“食譜”的方式。食譜以多對一關系連接到“house”,然后它與“account”具有 1:1 的關系。實作這個之后,我發現了一個 StackOverFlow,它以前不存在。(帳戶和會員之間的一種)
下面是資料庫中所述結構的影像。配方 -> 房子 -> 帳戶。(存在關系和表格,頂部帶有藍色十字,但并未真正連接)

我的物體如下所示:
package com.myhome.api.components.account.entity;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.myhome.api.components.house.entity.House;
import com.myhome.api.components.member.entity.Member;
import com.myhome.api.components.recipe.entity.Recipe;
import lombok.Data;
import javax.persistence.*;
import java.util.List;
import java.util.Set;
@Table(name = "account")
@Entity
@Data
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
@Column(name = "token")
private String token;
@OneToMany(
cascade = {CascadeType.ALL},
orphanRemoval = true,
mappedBy = "fkAccountId")
@JsonBackReference
private Set<Member> members;
}
package com.myhome.api.components.member.entity;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.myhome.api.components.account.entity.Account;
import com.myhome.api.components.meal.entity.Meal;
import com.myhome.api.components.rating.entity.Rating;
import lombok.Data;
import javax.persistence.*;
import java.util.Set;
@Table(name = "member")
@Entity
@Data
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "icon")
private Integer icon;
@ManyToOne
@JoinColumn(name = "fkAccountId", nullable = false)
@JsonManagedReference
private Account fkAccountId;
@OneToMany(
cascade = {CascadeType.ALL},
orphanRemoval = true,
mappedBy = "fkMemberId")
@JsonBackReference
private Set<Meal> meals;
@OneToMany(
cascade = {CascadeType.ALL},
orphanRemoval = true,
mappedBy = "fkMemberId")
@JsonBackReference
private Set<Rating> ratings;
}
我的問題是:
- 為什么會發生這種情況,即使在我添加食譜和房子之間的聯系之前它沒有發生?
- 我該如何解決?
- 原因是什么?
uj5u.com熱心網友回復:
為什么會這樣
這是由toString()兩個類中都存在方法并形成回圈依賴關系引起的。這會導致Account和Member的 toString() 方法之間的無限遞回呼叫。
考慮這兩個簡單的類。Lombok@Data默認為所有欄位生成 toString 方法。
class Member {
String name;
Account account;
@Override
public String toString() {
return "Member{"
"name='" name '\''
", account=" account.toString() //Although string concatenation calls toString() on instance, I thought of adding it to call it out
'}';
}
}
class Account {
String id;
Member member;
@Override
public String toString() {
return "Account{"
"id='" id '\''
", member=" member.toString() //Although string concatenation calls toString on instance, I thought of adding it to call it out
'}';
}
}
public static void main(String[] args) {
Account account = new Account();
Member member = new Member();
account.id="1";
account.member=member;
member.name ="XYZ";
member.account=account;
System.out.println(account);
}
當您在其中一個類上呼叫 toString 方法時,說它Account會依次呼叫toStringof 方法,Member并且回圈重復,直到您用完堆疊記憶體。這是堆疊跟蹤:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.StringBuilder.append(StringBuilder.java:136)
at com.javainuse.main.Member.toString(AnotherMain.java:23)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.javainuse.main.Account.toString(AnotherMain.java:10)
at java.lang.String.valueOf(String.java:2994)
我該如何解決?
為您的 lombok 中的一個類排除 toString 生成,這應該可以作業。參考這個我建議物體類根本不需要 toString 。
原因是什么?
我想我不明白。你能詳細說明一下嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/421022.html
標籤:
