Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制Hibernate返回正确的子类代理_Java_Hibernate_Subclass - Fatal编程技术网

Java 强制Hibernate返回正确的子类代理

Java 强制Hibernate返回正确的子类代理,java,hibernate,subclass,Java,Hibernate,Subclass,我有以下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 { /*

我有以下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 = db.createQuery("from User where email = :email")
              .setParameter("email", email)
              .uniqueResult();
不幸的是,
user
始终是
user
的代理,因此我无法将其转换为
Doctor

我是否可以强制Hibernate仔细查看用户类型并返回正确的代理,可能不执行另一个查询?

我认为如果该用户尚未作为用户加载(例如,由于以前加载的关联),它应该返回正确的子类实例

如果没有,那么您就无法让它返回实际的医生实例。因此,您应该调用User的多态方法,或者使用专有的Hibernate代码检查它是否是代理,初始化它并获取包装的对象


如果您事先知道它是医生,那么请使用“来自医生”而不是“来自用户”。

请注意,因为为了获得特定实例,Hibernate将与所有子类表执行联合。可能对性能非常不利。