J'ai une hiérarchie de classes comme ceci:JPA héritage entitymanager.find produit ClassCastException
@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;
}
}
}
Quand je fais ceci: log.debug ("chargé:" + callDistributionPolicyDao.get (10) .toString())
il imprime la toString() du SkillsBasedCallDistributionPolicy
Mais lorsque je tente de le jeter comme ceci:
SkillsBasedCallDistributionPolicy scdp = (SkillsBasedCallDistributionPolicy) callDistributionPolicyDao.get(10)
Je reçois une exception de conversion de classe.
com.vantage.callcenter.core.entity.acd.CallDistributionPolicy$$EnhancerByCGLIB$$334f3d1b cannot be cast to com.vantage.callcenter.core.entity.acd.SkillBasedCallDistributionPolicy
La vérification de l'instance échoue aussi!
Lorsque j'inspecte l'objet dans Eclipse, je vois le proxy CGLIB, mais si je comprends bien, le proxy CGLIB devrait étendre la classe SkillsBasedCallDistributionPolicy? Dans la propriété CGLIB $ CALLBACK_0, je peux voir la classe d'entité est "CallDistributionPolicy" mais la cible est "SkillsBasedCallDistributionPolicy".
Quel devrait être le processus approprié de chargement de la sous-classe? Je peux voir hibernate générer tout le droit SQL et le chargement de la sous-classe appropriée, mais comment puis-je vérifier l'instanceof et le jeter dans une sous-classe? J'utilise Hibernate 3.2.1, Spring 2.5.5, cglib2.1_3. Aucune suggestion?
Qu'est-ce 'AbstractJPADAOImpl'? Comment le DAO est-il branché au printemps? – skaffman