2011-12-17 4 views
3

を返すように私は、次のHibernateのクラスがありますログインフェーズフォースHibernateは正しいサブクラスプロキシ

@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の代理である

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

を実行します私はDoctorにキャストできません。 Hibernateがユーザータイプを注意深く見て、別のクエリを実行することなく、正しいプロキシを返すように強制できますか?

+0

特定のインスタンスを取得するために、HibernateはすべてのサブクラステーブルでUNIONを実行するため注意してください。パフォーマンスが悪いことがあります。 –

答えて

1

このユーザーがまだユーザーとしてロードされていない場合(たとえば、以前にロードされた関連付けのため)、正しいサブクラスインスタンスを返してください。

もしそうでなければ、実際のDoctorインスタンスを返す方法はありません。だから、多態的なUserメソッドを呼び出すか、独自のHibernateコードを使ってそれがプロキシであるかどうかを確認し、初期化してラップされたオブジェクトを取得する必要があります。

ドクターであることが事前に分かっている場合は、「ユーザーから」ではなく「医師から」を使用してください。