【发布时间】:2016-04-15 06:31:30
【问题描述】:
我使用Hibernate v.4(在Spring MVC 内)。使用DiscriminatorColumn 的SINGLE_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(...) 指定确切的类。但对于特定部分,我需要访问实体的特定字段,因此我必须将对象转换为精确类型(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
问题:有什么方法可以配置我的实体或使用特殊技巧从数据库加载实体并获取对应行呈现的精确类型的对象?
【问题讨论】:
标签: java hibernate single-table-inheritance