跟着Udemy教程操作Hibernate SessionFactory报错,求助解决
Hibernate SessionFactory 创建失败的常见解决方法
针对你在创建SessionFactory时遇到的报错,以下是几个排查和解决方向:
版本兼容问题
如果你使用的是Hibernate 5.4及以上版本,buildSessionFactory()方法已过时,需要结合StandardServiceRegistryBuilder来构建:SessionFactory factory = new Configuration() .configure("hibernate.cfg.xml") .addAnnotatedClass(Student.class) .buildSessionFactory(new StandardServiceRegistryBuilder().build());或者直接使用无参数的
configure()自动加载默认配置文件,简化代码:SessionFactory factory = new Configuration() .configure() .addAnnotatedClass(Student.class) .buildSessionFactory(new StandardServiceRegistryBuilder().build());配置文件路径错误
确保hibernate.cfg.xml放在类路径根目录下:- Maven/Gradle项目:放在
src/main/resources目录 - 普通Java项目:放在src目录下(编译后会到classes根目录)
如果手动指定路径,要确保路径拼写完全正确,也可以直接用无参数configure()让Hibernate自动查找配置文件。
- Maven/Gradle项目:放在
依赖缺失或版本冲突
检查项目依赖是否完整,确保Hibernate核心、数据库驱动等依赖版本匹配。以Maven为例,正确的依赖配置如下:<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.14.Final</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>避免同时引入不同版本的Hibernate相关依赖,比如旧版的
hibernate-entitymanager和新版hibernate-core混用。实体类注解不规范
确保Student实体类符合Hibernate要求:- 必须添加
@Entity注解,指定对应数据库表 - 主键字段添加
@Id和合适的@GeneratedValue策略 - 必须提供无参构造器(Hibernate实例化实体时需要)
示例规范的实体类:
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Table; @Entity @Table(name = "student") public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String firstName; private String lastName; private String email; // 无参构造器 public Student() {} // 带参构造器 public Student(String firstName, String lastName, String email) { this.firstName = firstName; this.lastName = lastName; this.email = email; } // getter和setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }- 必须添加
数据库连接配置错误
检查hibernate.cfg.xml中的数据库连接参数:- URL是否正确(MySQL 8.0+需要指定时区,比如
jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC) - 用户名、密码是否和数据库匹配
- 目标数据库是否已创建,数据库服务是否正常运行
- URL是否正确(MySQL 8.0+需要指定时区,比如
内容的提问来源于stack exchange,提问作者Anjita Kandel
相关产品推荐
相关产品推荐

