Java JPA继承entitymanager.find生成ClassCastException
我有这样的类层次结构:Java JPA继承entitymanager.find生成ClassCastException,java,hibernate,spring,orm,jpa,Java,Hibernate,Spring,Orm,Jpa,我有这样的类层次结构: @Entity @Table (name="call_distribution_policies") @Inheritance (strategy=InheritanceType.JOINED) public class CallDistributionPolicy implements Serializable, Cloneable{ ---------------- } @Entity @Table(name="skill_based_call_distr
@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;
}
}
}
我得到了类强制转换异常
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。有什么建议吗?我知道Hibernate在很长一段时间内一直存在这个问题,例如,请参见:
- )
实例和强制转换应该可以正常工作
但是我无法用Hibernate 3.3.0.SP1重现您的问题。instanceof
和使用连接策略对层次结构的子类进行强制转换都很有效。通过以下方式进行测试:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-cglib-repack</artifactId>
<version>2.1_3</version>
</dependency>
org.hibernate
休眠cglib重新打包
2.1_3
及
javassist
javassist
3.8.0.GA
我很确定这是Jira的问题,但找不到
问题(bug)在我的应用程序中是一致的。您能在这里发布您的工作pom.xml吗?这样我就可以确切地看到您使用的hibernate依赖项是什么
下面是我使用的依赖项:
<project>
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.10</version>
</dependency>
</dependencies>
</dependencyManagement>
...
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-cglib-repack</artifactId>
<version>2.1_3</version>
</dependency>
...
</dependencies>
</project>
...
org.slf4j
slf4j api
1.5.10
...
org.hibernate
休眠实体管理器
3.4.0.GA
javassist
javassist
org.hibernate
休眠cglib重新打包
2.1_3
...
以下是依赖关系树:
[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile
[INFO] | +- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
[INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
[INFO] | +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
[INFO] | +- org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
[INFO] | | +- antlr:antlr:jar:2.7.6:compile
[INFO] | | \- commons-collections:commons-collections:jar:3.1:compile
[INFO] | +- org.slf4j:slf4j-api:jar:1.5.10:compile
[INFO] | +- dom4j:dom4j:jar:1.6.1:compile
[INFO] | | \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] | \- javax.transaction:jta:jar:1.1:compile
...
[INFO] \- org.hibernate:hibernate-cglib-repack:jar:2.1_3:compile
[INFO]+-org.hibernate:hibernate entitymanager:jar:3.4.0.GA:compile
[INFO]|+-org.hibernate:ejb3持久性:jar:1.0.2.GA:compile
[INFO]|+-org.hibernate:hibernate commons注释:jar:3.1.0.GA:compile
[INFO]|+-org.hibernate:hibernate注释:jar:3.4.0.GA:compile
[INFO]|+-org.hibernate:hibernate核心:jar:3.3.0.SP1:compile
[INFO]| |+-antlr:antlr:jar:2.7.6:编译
[INFO]| | \-公用集合:公用集合:jar:3.1:编译
[信息]|+-org.slf4j:slf4j api:jar:1.5.10:编译
[INFO]|+-dom4j:dom4j:jar:1.6.1:compile
[INFO]| | \-xmlapi:xmlapi:jar:1.0.b2:compile
[INFO]\-javax.transaction:jta:jar:1.1:compile
...
[INFO]\-org.hibernate:hibernate cglib repack:jar:2.1\u 3:compile
什么是抽象JPADAOIMPL
?春天的刀是怎么接线的?嗨,帕斯卡,谢谢你的回复。问题(bug)在我的应用程序中是一致的。您能在这里发布您的工作pom.xml吗?这样我就可以确切地看到您使用的是什么hibernate依赖项了?谢谢,我会更新我的pom,看看它是否有什么不同。
<project>
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.10</version>
</dependency>
</dependencies>
</dependencyManagement>
...
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
<exclusions>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-cglib-repack</artifactId>
<version>2.1_3</version>
</dependency>
...
</dependencies>
</project>
[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.4.0.GA:compile
[INFO] | +- org.hibernate:ejb3-persistence:jar:1.0.2.GA:compile
[INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.1.0.GA:compile
[INFO] | +- org.hibernate:hibernate-annotations:jar:3.4.0.GA:compile
[INFO] | +- org.hibernate:hibernate-core:jar:3.3.0.SP1:compile
[INFO] | | +- antlr:antlr:jar:2.7.6:compile
[INFO] | | \- commons-collections:commons-collections:jar:3.1:compile
[INFO] | +- org.slf4j:slf4j-api:jar:1.5.10:compile
[INFO] | +- dom4j:dom4j:jar:1.6.1:compile
[INFO] | | \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] | \- javax.transaction:jta:jar:1.1:compile
...
[INFO] \- org.hibernate:hibernate-cglib-repack:jar:2.1_3:compile