2011-12-17 2 views
3

올바른 서브 클래스의 프록시 반환 : 로그인 단계에서강제 절전 나는 다음 최대 절전 모드 클래스 한

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public abstract class User { 
    @Id 
    private Long id; 
} 

@Entity 
public class Patient extends User { 
    /* ... */ 
} 

@Entity 
public class Doctor extends User { 
    /* ... */ 
} 

, 나는

User user = db.createQuery("from User where email = :email") 
       .setParameter("email", email) 
       .uniqueResult(); 

불길을 실행을 user 때문에, 항상 User의 프록시 나는 그것을 Doctor에 던질 수 없다. 하이버 네이트가 다른 쿼리를 실행하지 않고 사용자 유형을 자세히보고 올바른 프록시를 반환하도록 강제 할 수 있습니까?

+0

Hibernate는 특정 인스턴스를 얻기 위해 모든 하위 클래스 테이블과 함께 UNION을 실행하기 때문에 조심해야한다. 성능에 좋지 않을 수 있습니다. –

답변

1

이 사용자가 아직 사용자로로드되지 않은 경우 (예 : 이전에로드 된 연결로 인해) 올바른 서브 클래스 인스턴스를 반환해야한다고 생각합니다.

그렇지 않은 경우 실제 Doctor 인스턴스를 반환 할 방법이 없습니다. 따라서 사용자의 다형성 (polymorphic) 메소드를 호출하거나 독점적 인 Hibernate 코드를 사용하여 프록시인지 확인하고 초기화하고 래핑 된 객체를 가져와야합니다.

닥터라는 것을 미리 안다면 "from User"보다는 "from Doctor"를 사용하십시오.