我有一个这样的类层次结构:
@Entity
@Table (name="call_distribution_policies")
@Inheritance (strategy=InheritanceType.JOINED)
public class CallDistributionPolicy implements Serializable, Cloneable{
----------------
}
@Entity
@Table(name="skill_based_call_distribution_policies")
public class SkillBasedCallDistributionPolicy extends CallDistributionPolicy {
--------------
}
public class CallDistributionPolicyDAOJPAImpl extends
AbstractJPADAOImpl<CallDistributionPolicy> implements
CallDistributionPolicyDAO {
}
public CallDistributionPolicy get(long id) {
try {
Query query = entityManager
.createQuery("from CallDistributionPolicy where id = :id");
query.setParameter("id", id);
List<CallDistributionPolicy> resultList = query.getResultList();
if (!CollectionUtils.isEmpty(resultList)) {
return resultList.get(0);
}
return null;
} catch (EntityNotFoundException e) {
return null;
}
}
}
当我这样做时:
log.debug(" 已加载: " + callDistributionPolicyDao.get(10).toString())
它打印 SkillsBasedCallDistributionPolicy 的 toString()
但是当我尝试像这样投射它时:
SkillsBasedCallDistributionPolicy scdp = (SkillsBasedCallDistributionPolicy) callDistributionPolicyDao.get(10)
我得到了类强制转换异常。
com.vantage.callcenter.core.entity.acd.CallDistributionPolicy$$EnhancerByCGLIB$$334f3d1b cannot be cast to com.vantage.callcenter.core.entity.acd.SkillBasedCallDistributionPolicy
instanceof 检查也失败!
当我在 eclipse 中检查对象时,我看到了 CGLIB 代理,但据我了解,CGLIB 代理应该扩展 SkillsBasedCallDistributionPolicy 类?在 CGLIB$CALLBACK_0 属性中,我可以看到实体类是“CallDistributionPolicy”,但目标是“SkillsBasedCallDistributionPolicy”。
加载子类的正确过程应该是什么?我可以看到 hibernate 正在生成所有正确的 SQL 并加载正确的子类,但是我如何检查 instanceof 并将其转换为子类?
我正在使用 hibernate 3.2.1 、 Spring 2.5.5 、 cglib2.1_3 。有什么建议么?