IntelliJ中Spring MVC+Hibernate项目报TypeNotPresentException错误求助
java.lang.TypeNotPresentException: Type org.hibernate.SessionFactory not present错误 嘿,我来帮你梳理这个问题的根源,一步步帮你修复:
核心问题:Hibernate依赖版本冲突
你pom.xml里同时引入了hibernate-core:5.2.5.Final和hibernate-entitymanager:5.0.12.Final——这俩版本差得太远了,而且从Hibernate 5.2开始,hibernate-entitymanager已经被合并到hibernate-core里了,单独引入低版本的entitymanager直接导致类加载混乱,org.hibernate.SessionFactory就是这么找不到的。
第一步:修复Hibernate依赖
修改pom.xml,删掉单独的hibernate-entitymanager依赖,只保留hibernate-core就行:
<!-- 只保留这个Hibernate核心依赖 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.5.Final</version> </dependency> <!-- 把下面这个删掉 --> <!-- <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.0.12.Final</version> </dependency> -->
其他几个需要调整的点
第二步:确保Spring版本和Hibernate兼容
你的${org.springframework-version}建议用4.3.x系列(比如4.3.18.RELEASE),这个版本和Hibernate 5.2.x完美适配,能避免Spring ORM和Hibernate之间的类不兼容问题。
第三步:修正数据库URL格式
你Dispatcher.xml里的JDBC URL写错了:
<beans:property name="jdbcUrl" value="jdbc:oracle:thin:hr@//localhost:1521.org:1521/xe" />
这里的localhost:1521.org:1521明显格式错误,改成正常的Oracle连接URL:
<beans:property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521/xe" />
第四步:给控制器方法加事务注解
你的HomeController里直接调用save方法,但没有开启事务,运行时会抛出事务缺失的错误,给方法加上@Transactional注解:
@Controller public class HomeController { @Autowired SessionFactory sessionFactory; @GetMapping("/") @Transactional // 加上这个注解,确保操作在事务中执行 public String index(Model m) { m.addAttribute("someAttribute", "someValue"); Person person = new Person(); person.setName("efe"); person.setCountry("Italy"); // 别手动设id,你的实体用了IDENTITY自增,数据库会自动生成 sessionFactory.getCurrentSession().save(person); return "index"; } }
第五步:检查Tomcat部署时的依赖
用IntelliJ部署的时候,要确认项目的Artifact把所有依赖(Hibernate、Spring、C3P0这些)都打包到了WEB-INF/lib目录里。可以在Run/Debug Configuration的Deployment标签页里查看Artifact的内容,确保没有漏掉依赖。
最后验证
改完这些之后,重新构建项目,启动Tomcat,访问根路径,应该就能正常把数据存到数据库里,不会再出现500错误和TypeNotPresentException了。
内容的提问来源于stack exchange,提问作者IsoKing

