2016-07-27 10 views
2

모델 카테고리가 있습니다. 상위 카테고리 및 하위 카테고리 목록이있을 수 있습니다. 엔티티가 자신과 관련이있는 경우를 찾을 수 없기 때문에이 질문을 썼습니다.FetchType.Lazy가 작동하지 않는 이유는 무엇입니까?

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

그러나에 아동 모델 : 나는 같은 것을 볼 것으로 예상

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

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

parent.getSubcategories().add(child1); 

categoryPersistence.save(parent); 

:

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

내가 좋아하는 엔티티를 저장합니다

나는 이런 식으로 구현하려고 제출 한 부모 나는 재귀 루프 있습니다. 어떻게 방지 할 수 있습니까?

그래, 나는 또한 @JsonIgnore를 사용했다. 그러나 나는 그것이 좋은 연습인지 확신하지 못했습니다. 하지만 하나의 카테고리가 필요할 때 부모에게 UI로 보내야 할 경우가 있습니다. @JsonIgnore가 이것을 만들 수 있습니까?

+0

실제 개체를 가져 오는 메서드에서 매개 변수에 'referenced'라는 부울 값을 가질 수 있습니다.이 부울 값은 개체가 자체를 호출하면 true로 설정됩니다. 그런 다음 생성하는 동안'if (! referenced) {... '를 체크하면 재귀 루프를 피할 수 있고 한번만 참조를 얻을 수 있습니다. – ghoulfolk

답변

0

@damienMiheev는 또한 같은 문제로 고통을하지만, 문제 1 또는 30 분 디버깅 난 당신의 분야의 자동 JSON 생성 게터가 호출지고있는 동안 부모 필드, 느리게로드 된 경우에도 그건

을 알아 냈어 값을 가져 오는 중입니다. 이는 주기적으로 실행됩니다. 부모를 가져오고 자식을 가져온 후 하위 컬렉션에있는 모든 자식에 대해 부모를 다시 가져 와서 StackOverflows 때까지이 프로세스를 계속하기 때문입니다. 여기

당신은 "부모"json으로 세대 예를 제외해야 문제에 대한 솔루션입니다 해당 필드를 @JsonIgnore로 표시 할 수 있습니다. hashCode(), equals() 및 toString() 메서드에도 부모 및 자식을 포함하지 않아야합니다.

관련 문제