2011-03-25 3 views
1

conside이 시나리오를 삽입 parent.setChildren(childList);을 바꾸고 parentService()에서 이와 같이 반복하십시오.JPA 최대 절전 모드 많은 배치 한이

for(Child c: childList){ 
c.setFather(parent.getId()); 
parent.getChildrent().add(c); 
} 

이 정확합니까? 다시 childList를 반복하지 않고 할 수있는 더 좋은 방법이 있습니까?

답변

3

최대 절전 모드로 작업 할 때, 양방향 관계의 양측의 일관된 상태를 유지하는 것은 사용자의 책임입니다. 또한, 관계를 유지할 때 Hibernate는 소유 측 (mappedBy이없는 측)을보고 있으므로 optional=false이 없어도 코드가 올바르지 않을 것입니다.

당신은 consistensy을 보장하기 위해 다음과 같은 방법을 사용할 수 있습니다 setChildren()이 경우 가시성에

class Parent { 
    ... 
    public void addChild(Child c) { 
     children.add(c); 
     c.setParent(this); 
    } 
} 

public Parent parentService(List<Child> childList) { 
    ... 
    for (Child c: childList) { 
     parent.addChild(c); 
    } 
    ... 
} 

잘못된 호출을 방지하기 위해 제한 할 수 있습니다.

마찬가지로 캐스 케이 딩이 없으며 부모와 동일한 트랜잭션 내에 하위 항목을 유지하지 않는 것이 이상합니다.

+0

! 나는 양쪽에 cascade = {CascadeType.ALL}을 추가했다. 그리고 나는 당신이 "부모와 같은 거래 내에서 아이들을 존속하지 않는다는 것이 이상하게 보입니다"라고하는 것이 무엇을 의미하는지 이해하지 못합니다. 내가 부모를 유지할 때 자동으로 그와 그의 컬렉션의 모든 요소를 ​​유지할 수 있습니까? (어린이) – Kossel

+0

컬렉션의 요소는 계단식을 구성한 경우에만 자동으로 유지되므로 '계단식'이 없으면 이상하게 보입니다. – axtavt

0

나는 좋은 일이라고 생각합니다. 유닛 테스트에서 자동으로 "아버지"를 설정할 수있는 최대 절전 모드를 사용할 수 없지만 코드는 여전히 작동해야합니다.

+0

Hibernate는 "father"를 "자동으로"설정하지 않습니다. 감사합니다. – axtavt