我使用Hibernate
v.4(在Spring MVC
内)。使用SINGLE_TABLE
:{/ p>在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界面,所以在输入中(比如在HttpServletRequest
中)我只有 id
的对象,但我没有&#39 ; t知道这个对象究竟是哪种类型;这就是我无法为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
问题:我可以用任何方式配置我的实体或使用特殊技巧从数据库加载实体并获取对应行所呈现的精确类型的对象吗?
答案 0 :(得分:0)
嗯,这很简单:我应该使用session.get(A.class, id)
代替session.load(...)
。