有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java按id加载实体,带有单_表继承

我使用Hibernatev.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(...)指定确切的类。但对于特定的部分,我需要访问实体的特定字段,所以我必须将对象转换为精确的类型(BC

因此,当我执行A a = (A) session.load(A.class, id);时,它在类型A下构造代理对象,因此它不能被转换为BC

java.lang.ClassCastException: my.A_$$_jvst551_6 cannot be cast to my.B

问题是:我如何配置我的实体,或者使用特殊的技巧从数据库中加载实体,并获得精确类型的对应行的对象


共 (1) 个答案

  1. # 1 楼答案

    嗯,这很简单:我应该使用session.get(A.class, id)而不是session.load(...)