【发布时间】:2011-04-02 05:08:22
【问题描述】:
我有一个这样的类层次结构:
@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("loaded:" + 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 并将其转换为子类?
我正在使用休眠 3.2.1、Spring 2.5.5、cglib2.1_3。有什么建议吗?
【问题讨论】:
-
什么是
AbstractJPADAOImpl? DAO 在 Spring 中是如何连接的?
标签: java hibernate spring orm jpa