You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:24:51