使用 SINGLE_TABLE 继承按 id 加载实体
Load entity by id with SINGLE_TABLE inheritance
我使用 Hibernate
v.4(在 Spring MVC
内)。使用 DiscriminatorColumn
:
的 SINGLE_TABLE
策略在一个 table 上映射了多个继承实体
@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 界面来管理这个实体,所以在输入中(比如在 HttpServletRequest
中)我只有对象的 id
,但我不知道这个对象到底是哪种类型;这就是为什么我不能为 session.load(...)
指定确切的 class。但对于特定部分,我需要访问实体的特定字段,因此我必须将对象转换为精确类型(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
问题:有什么方法可以配置我的实体或使用特殊技巧从数据库加载实体并获取对应行显示的精确类型的对象?
嗯,很简单:我应该使用 session.get(A.class, id)
而不是 session.load(...)
。
我使用 Hibernate
v.4(在 Spring MVC
内)。使用 DiscriminatorColumn
:
SINGLE_TABLE
策略在一个 table 上映射了多个继承实体
@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 界面来管理这个实体,所以在输入中(比如在 HttpServletRequest
中)我只有对象的 id
,但我不知道这个对象到底是哪种类型;这就是为什么我不能为 session.load(...)
指定确切的 class。但对于特定部分,我需要访问实体的特定字段,因此我必须将对象转换为精确类型(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
问题:有什么方法可以配置我的实体或使用特殊技巧从数据库加载实体并获取对应行显示的精确类型的对象?
嗯,很简单:我应该使用 session.get(A.class, id)
而不是 session.load(...)
。