java按id加载实体,带有单_表继承
我使用Hibernate
v.4(在Spring MVC
内)。有几个继承的实体映射到一个表上,使用SINGLE_TABLE
策略使用DiscriminatorColumn
:
@Entity
@DiscriminatorColumn
@DiscriminatorOptions(force = true)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class A {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
...
}
@Entity
@DiscriminatorValue(value = "B")
public class B extends A {
...
}
@Entity
@DiscriminatorValue(value = "C")
public class C extends A {
...
}
考虑到我有通用的GUI接口来管理这个实体,所以在输入中(例如在{{CD5>})中,对象只有<强> ^ {CD6>} /强>,但是我不知道这个对象究竟是哪种类型;这就是为什么我不能为session.load(...)
指定确切的类。但对于特定的部分,我需要访问实体的特定字段,所以我必须将对象转换为精确的类型(B
或C
)
因此,当我执行A a = (A) session.load(A.class, id);
时,它在类型A
下构造代理对象,因此它不能被转换为B
或C
:
java.lang.ClassCastException: my.A_$$_jvst551_6 cannot be cast to my.B
问题是:我如何配置我的实体,或者使用特殊的技巧从数据库中加载实体,并获得精确类型的对应行的对象
# 1 楼答案
嗯,这很简单:我应该使用
session.get(A.class, id)
而不是session.load(...)