2011-01-06 4 views
3

두 개의 도메인 개체 클래스 인 AB을 상상해보십시오. AB에 대한 양방향 일대 다 관계가 있습니다. A은 (과) B의 몇 천 달러와 관계가 있습니다. 관계는 고유해야하며 복제본을 가질 수 없습니다.최대 절전 모드에서 개체가 다른 개체에 연결되어 있는지 확인하십시오.

B의 인스턴스가 이미 A의 인스턴스에 연결되어 있는지 확인하려면 쉽게 INNER JOIN을 수행 할 수 있지만이 작업은 이미 지속 된 관계 만 보장합니다.

현재 일시적인 관계는 어떻습니까?

class A { 
    @OneToMany 
    private List<B> listOfB; 
} 

우리는 listOfB에 액세스하고 데이터 소스에서 게으른 B의 연결된 모든 인스턴스를 가져옵니다 contains()이의 검사를 수행합니다. 난 단지 그들의 기본 키에 의해 그들을 확인하고 싶습니다.

내가 좋아하는 일을 할 수있는 쉬운 해결책이 있습니까 "A의이 인스턴스가 B의 인스턴스와 연결되어 있는가가?"메모리에 모든 데이터를로드 및 컬렉션을 기반으로 검색을 수행하지 않고?

답변

2

관계 이 아니라고 말할 수있다 당신은 모든 대답을했습니다. 여분의 게으른 콜렉션이 나를 위해 트릭을했습니다. LazyCollection 주석을 사용하여 @OneToMany 연결을 구성했습니다.

@IndexColumn(name = "index", base = 1) 
@LazyCollection(LazyCollectionOption.EXTRA) 

Hibernate: Extra-lazy collection fetching 문서가 도움이되었습니다. 이 옵션을 사용하면 #size(), #contains(), 등은 수집 초기화를 트리거하지 않습니다.

0

+0

확실히 모든 개체를로드합니다. 문제가 있습니다. 성능 문제가 있습니다. Hibernate는이 모든 객체들을 생성하고 초기화한다. – codevour

0

가 왜 INNER JOIN을 수행 할 수 없습니다 A.에 대한 연관과 연관이 양방향이기 때문에, 나는 B의 특정 인스턴스에서 검색을 할 것, 귀하의 질문에 좀 더의 마지막 단락에 대한 생각?

default flush mode를 사용하면, Hibernate는 쿼리를 실행하기 전에 세션을 플러시하므로, 저장되지 않은 원소들의 집합은 문제가되지 않는다.

1

두 단계로 수행 할 수 있다고 생각합니다. 일시적인 B의 경우 transient를 의 B를 listOfB에 추가하면 과도기 목록에도 추가됩니다. 이 목록에 귀하의 수표가 들어 있습니까? 귀하의 지속 B 년대 들어

, 같은 쿼리 뭔가를 사용

select count(*) from B b where b.a.id = :aId 

이 쿼리가 0을 반환하는 경우, 당신은 감사 A와 B

사이
관련 문제