Hibernate连接异常:无法关联Song类与MySQL执行查询
问题排查与修复方案
1. 配置文件语法错误
你的hibernate.cfg.xml中有一行标签不完整,直接导致配置解析失败:
原错误行:
name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
修复后(补全<property标签开头):
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
如果不需要缓存功能,可直接删除该行,避免额外依赖问题。
2. 实体类缺少无参构造函数
Hibernate要求实体类必须有公共无参构造函数,用于反射实例化对象。你的Song类仅定义了带参构造,需补充无参构造:
public Song() { // 无参构造为Hibernate必需 }
3. 实体实例化代码错误
你的Source.java中使用new Song()创建对象,但Song类无无参构造,这会引发编译错误。可以选择两种修复方式:
- 方式一:用无参构造+setter赋值(需先添加无参构造)
Song song1 = new Song(); song1.setId(1); song1.setSongname("Cameo"); song1.setArtist("James Cameo");
- 方式二:直接调用带参构造
Song song1 = new Song(1, "Cameo", "James Cameo");
4. 数据库连接缺少密码配置
若你的MySQL设置了密码,hibernate.cfg.xml必须添加密码属性,否则会被数据库拒绝连接:
<property name="hibernate.connection.password">你的MySQL密码</property>
若MySQL未设置密码可暂时忽略,但生产环境不推荐此做法。
5. 依赖版本兼容性检查
确保Hibernate与MySQL驱动版本兼容:
- 若使用Hibernate 5.x,推荐搭配MySQL驱动
8.0.x,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 6.x,需改用
hibernate-core-jakarta依赖,MySQL驱动版本仍推荐8.0.x。
修复后的完整代码与配置
修复后的Song.java
package com.projects.demohibernate; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @Entity(name="Song") public class Song { @Id @Column(name = "id") private int id; @Column(name = "Songname") private String Songname; @Column(name = "Artist") private String Artist; // 必须添加的无参构造 public Song() {} public Song(int id, String songname, String artist) { this.id = id; Songname = songname; Artist = artist; } public void setId(int id) { this.id = id; } public void setSongname(String songname) { Songname = songname; } public void setArtist(String artist) { Artist = artist; } // 可选:添加getter方法,方便后续查询使用 public int getId() { return id; } public String getSongname() { return Songname; } public String getArtist() { return Artist; } }
修复后的hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Song?useSSL=false&serverTimezone=UTC</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">你的密码</property> <!-- 替换为实际密码 --> <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.show_sql">true</property> <!-- 不需要缓存可删除此行,否则需确保引入ehcache依赖 --> <!-- <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> --> </session-factory> </hibernate-configuration>
注:URL中添加
useSSL=false&serverTimezone=UTC,用于避免SSL连接警告和时区匹配问题。
修复后的Source.java
package com.projects.demohibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class Source { public static void main(String[] args) { Configuration configuration = new Configuration(); configuration.configure("hibernate.cfg.xml"); configuration.addAnnotatedClass(Song.class); SessionFactory sessionFactory = configuration.buildSessionFactory(); try (Session session = sessionFactory.openSession()) { Song song1 = new Song(); song1.setId(1); song1.setSongname("Cameo"); song1.setArtist("James Cameo"); session.beginTransaction(); session.save(song1); session.getTransaction().commit(); System.out.println("Song saved successfully"); } catch (Exception e) { e.printStackTrace(); // 打印异常信息,方便排查剩余问题 } finally { sessionFactory.close(); // 确保SessionFactory正常关闭 } } }
额外检查项
- 确认MySQL服务处于运行状态,端口3306可正常访问。
- 确认数据库
Song已存在;若不存在,可将hibernate.hbm2ddl.auto设为create,Hibernate会自动创建数据库和表,测试完成后改回update。 - 若使用Maven/Gradle,确保所有依赖已正确下载,无缺失或版本冲突。
内容的提问来源于stack exchange,提问作者ASHWIN HARISH P
相关产品推荐
相关产品推荐

