2016-07-27 147 views
2

我有模型類別。它可能有父類別和子類別列表。我寫了這個問題,因爲找不到與實體相關的情況。爲什麼不FetchType.Lazy工作?

我想實現這樣的:

@Entity 
public class Category { 
@Id 
private String id; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "parent_id") 
private Category parent; 

@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.PERSIST) 
private List<Category> subcategories = Lists.newArrayList(); 
} 

我省像實體:

Category parent = new Category(); 
parent.setName("parent"); 

Category child1 = new Category(); 
child1.setName("child1"); 
child1.setParent(parent); 

parent.getSubcategories().add(child1); 

categoryPersistence.save(parent); 

我希望看到這樣的:

parent { 
id 
parent: null 
childs { 
    child { 
     id 
     parent: ...lazy loading exception... 
     childs: null 
    } 
} 
} 

但在兒童模特提交父母我有遞歸循環。 如何防止它?

是的,我也用@JsonIgnore。但我不確定這是否是好的做法。 但是,如果我有一個案件,當我需要一個類別,我真的需要發送它與UI的UI。 @JsonIgnore可以產生這個嗎?

+0

關於獲取實際對象的方法,您可以在參數中使用一個布爾值,例如名爲'referenced'的參數,然後在對象調用其自身時將其設置爲true。然後在構建過程中,檢查'if(!referenced){...'這樣你就可以避免遞歸循環,只獲取一次引用。 – ghoulfolk

回答

0

@damienMiheev我也從同樣的問題之苦,但調試問題1或半小時,我想通了,

,即使你的父字段加載懶洋洋地,而你的字段的自動生成JSON吸氣獲取調用它正在提取值,這是創建一些循環執行。 因爲它是獲取父對象,然後獲取子對象並再次爲子對象集合中的每個子對象獲取父對象,並繼續此過程直到StackOverflows。

這裏是你的問題

您應該排除「父」的從JSON代例如解決方案您可以將該字段標記爲@JsonIgnore。 你也不應該在你的hashCode(),equals()和toString()方法中包含父項和子項。