Preference と 1 対 1 の関係を持つクラス User があります (プロパティは storedPreference と呼ばれます)。CustomPreference (Preference のサブクラス) のインスタンスが storedPreference として保存されているユーザーを想定します。storedPreference を取得して 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;
}
...
}
DB をチェックして、このインスタンスの DTYPE 値が CustomPreference であり、正しいことを確認しました