【发布时间】:2011-11-27 01:41:02
【问题描述】:
我正在使用每个具体类的继承策略表,今天我遇到了一些非常奇怪的事情。我仍然不知道这个问题的原因,但让我解释一下它是什么......
我有以下课程:
@Entity
@Table(name="...")
@Inheritance(strategy=InheritanceType.JOINED)
public class A implements Serializable{...}
@Entity
@Table(name="...")
@PrimaryKeyJoinColumn(name="...")
public class B extends A{...}
看起来很简单,我用来检索条目的查询基本上是这样的:
FROM A
这也返回了我所期望的 B 实例。 条目被加载到视图的支持 bean 中(Bean 是视图范围的,持久性上下文已结束)。视图通过 EL 访问 bean 以检索 dataTable 的条目:
<h:dataTable value="#{bean.entries}" var="entry">...</h:dataTable>
在 dataTable 中,我有一个这样的 commandLink:
<h:commandLink value="click" actionListener="#{bean.doSomething}">
<f:setPropertyActionListener value="#{entry}" target="#{bean.selected}" />
</h:commandLink>
该 bean 与 A 类型的对象一起使用,但如果所选条目的类型是子类,则调用 actionListener-Expression 时调用的 CDI-Decorator 会做额外的事情:
public void doSomething(ActionEvent event){
if(delegate.getSelected() instanceof B){
// special
}else{
delegate.doSomething(event);
}
}
现在它变得复杂了。 if 是“有时”输入的,但不是在预期的时候输入。调试显示 delegate.getSelected() 返回的 Object 是 A_javassisst 类型,即使它应该是 B 的实例。最好的事情是,toString() 方法返回 B@123,这让我相信首先,该对象是 B 类型,但不是...
现在我们来回答我的问题...那里到底发生了什么???我已经想到了在保存数据表的状态时可能会出现的一些序列化问题,但我不确定(数据表是否应该检索值表达式返回的值并使用这些值来遍历或者可能会中断国家?)。
dataTable是PrimeFaces数据表,没试过JSF数据表但不能是primefaces的错……
所有这些都在以下环境中:
- WAS 8.0.0.1 (=> OpenWebBeans)
- CODI 1.1.1
- MyFaces 2.1.1
- 休眠 3.6.5
提前感谢您的帮助!
编辑:
我所有的对象都是 B 类型,这意味着数据库包含表“b”中的一个条目,用于表“a”中的每个条目,但有时我从 JPA/Hibernate 返回的对象不是 B 的实例!请我在这方面需要帮助,我不知道为什么会发生这种情况!?!
编辑:
我的诊断是错误的,返回的类型是正确的!我真的有一个 B 类型的代理,而不是 A 类型的代理。我的问题是,被装饰的方法是在 setter 之前调用的。这比 Hibernate 更与 JSF 相关!
我还没有遇到你报告的问题和陷阱,使用 instanceof 对我来说很好!
【问题讨论】: