如何在hibernate中保存并加载属性的子类安装

如何在hibernate中保存并加载属性的子类安装,hibernate,inheritance,classcastexception,Hibernate,Inheritance,Classcastexception,我们有一个类用户,它与一个首选项具有一对一的关系(该属性称为StoredReference)。假设某个用户的CustomPreference实例(Preference的子类)被保存为其StoredReference。获取StoredReference并将其强制转换为CustomPreference会导致ClassCastException,但为什么呢 (CustomPreference)theUser.getStoredPreference() 原因 java.lang.ClassCastEx

我们有一个类用户,它与一个首选项具有一对一的关系(该属性称为StoredReference)。假设某个用户的CustomPreference实例(Preference的子类)被保存为其StoredReference。获取StoredReference并将其强制转换为CustomPreference会导致ClassCastException,但为什么呢

(CustomPreference)theUser.getStoredPreference()
原因

java.lang.ClassCastException: core.preferences.Preferences_$$_javassist_82 cannot be cast to hb.core.preferences.CustomPreferences
    at hb.base.user.user.HadithUser.getPreferences(HadithUser.java:39)
    at hb.base.user.user.HadithUser.getPreferences(HadithUser.java:23)
    at core.form.base.ThemeForm.getTheme(ThemeForm.java:116)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
    at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
    at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:179)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:183)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
    at org.primefaces.renderkit.HeadRenderer.encodeBegin(HeadRenderer.java:85)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:587)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:517)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541)
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1981)
    at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:298)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
    at org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(ResourceViewHandlerWrapper.java:93)
    at org.springframework.faces.webflow.FlowViewHandler.renderView(FlowViewHandler.java:99)
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
    ... 84 more
以下是实体定义:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Preferences {
   ...
}


@Entity
public class CustomPreferences extends Preferences {
   ...
}


@Entity
public class User {
    @OneToOne(fetch = FetchType.LAZY)
    public Preferences getStoredPreferences() {
        return storedPreferences;
    }

    ...
}

我检查了数据库以确保这个实例的DTYPE值是CustomPreference,并且是正确的

这与JPA本身无关。这是PlanJava,超类引用可以引用子类对象,但超类对象不能被子类引用

(CustomPreference)theUser.getStoredPreference();

Preference对象可以按Preference类型或其超类型引用,但不能按其子类型(即CustomPreference)引用。如果您尝试这样做,它会给出ClassCasteException

另存为StoredReference的对象是通过超类引用引用的CustomPreference。因此,将其转换回子类应该没有问题。