在TomEE中部署EAR时遇org/hibernate/mapping/MappedSuperclass异常求助
嘿,我之前也碰到过类似的坑,你遇到的org.apache.openejb.OpenEJBException本质是TomEE找不到org.hibernate.mapping.MappedSuperclass这个类,大概率是Hibernate版本不兼容、依赖不全或者TomEE的JPA默认配置没调整导致的,给你几个实用的排查和解决方向:
1. 先确认Hibernate版本和TomEE 1.7.4的适配性
TomEE 1.7.4是基于Java EE 6 Web Profile的,对应的JPA规范是2.0,所以你得用Hibernate 4.3.x系列(比如4.3.11.Final)才对。要是你用了Hibernate 5.x,那肯定会出问题——因为5.x是为JPA 2.1做的,TomEE 1.7.4根本不支持JPA 2.1,类结构都对不上。
2. 别只放核心JAR,Hibernate依赖要凑齐
你光把Hibernate核心包丢到TomEE/lib远远不够,得把这些必要的包都补上:
hibernate-core-xxx.jar:核心包,MappedSuperclass就在这里面,缺了它肯定报错hibernate-entitymanager-xxx.jar:Hibernate的JPA实现包,必须有jboss-logging-xxx.jar:Hibernate依赖的日志组件,没它启动会炸- 数据库驱动包:比如你用MySQL就放
mysql-connector-java-xxx.jar,根据你的数据库选 - 可选但建议加的:
hibernate-jpa-2.0-api-xxx.jar,确保JPA API版本和TomEE兼容
3. 让TomEE别用默认的OpenJPA,改成Hibernate
TomEE默认自带的是OpenJPA作为JPA实现,你得告诉它用Hibernate:
- 打开TomEE的
conf/system.properties,加一行配置:openejb.jpa.provider=org.hibernate.ejb.HibernatePersistence - 或者在你的EAR的
META-INF/application.xml里配置,但全局改一次更省心。
4. 检查JAR里的persistence.xml配置
确保你的JAR包中META-INF/persistence.xml指定了Hibernate作为提供者,比如:
<persistence-unit name="YourPersistenceUnit" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <!-- 这里加你的数据源配置、实体类扫描等 --> </persistence-unit>
如果用JTA事务,记得在TomEE的conf/tomee.xml里配置好对应的数据源哦。
5. 清理冲突的依赖包
去TomEE/lib目录看看有没有OpenJPA相关的JAR(比如openjpa-xxx.jar),有的话要么删掉要么重命名,不然TomEE会优先加载自带的OpenJPA,导致Hibernate的类根本没机会被加载,冲突就来了。
按上面的步骤调整完,重启TomEE再部署你的EAR,应该就能解决这个问题了!
内容的提问来源于stack exchange,提问作者Mukund S

