You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在IntelliJ IDEA中运行带DataSource的Hibernate应用

在IntelliJ IDEA中运行带有数据源(DataSource)的Hibernate应用指南

咱们结合你给出的现有配置,一步步来搞定这个问题:

一、先确认现有配置的正确性

你已经给出的这两段配置是没问题的,先确保它们的位置正确:

  • Hibernate.cfg.xml里的数据源配置:
    <property name="connection.datasource">java:/comp/env/jdbc/MyStatus-process</property>
    
  • web.xml里的资源引用配置:
    <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/MyStatus-process</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
    

二、在IDEA中配置应用服务器(以Tomcat为例)

因为你用的是容器管理的数据源(res-auth="Container"),所以需要把项目部署到Tomcat这类Servlet容器中运行:

  1. 打开IDEA顶部菜单栏的 Run > Edit Configurations
  2. 点击左上角的+号,选择 Tomcat Server > Local,创建一个本地Tomcat配置
  3. Configuration标签页,指定你的Tomcat安装路径(IDEA会自动识别大部分配置)
  4. 切换到Deployment标签页,点击+号,选择你的web项目(推荐选war exploded模式,方便调试)
  5. 关键配置:绑定JNDI数据源
    • 还是在Configuration标签页,找到VM options输入框,添加以下适配Tomcat JNDI上下文的参数:
      -Dcatalina.base="你的Tomcat本地路径"
      -Djava.naming.factory.initial=org.apache.naming.java.javaURLContextFactory
      -Djava.naming.factory.url.pkgs=org.apache.naming
      
    • 你可以在项目的webapp/META-INF目录下创建一个context.xml文件,用来配置具体的数据库连接信息(不用修改Tomcat全局配置),内容示例:
      <Context>
          <Resource name="jdbc/MyStatus-process"
                    auth="Container"
                    type="javax.sql.DataSource"
                    driverClassName="com.mysql.cj.jdbc.Driver"
                    url="jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&amp;serverTimezone=UTC"
                    username="你的数据库用户名"
                    password="你的数据库密码"
                    maxTotal="20"
                    maxIdle="10"
                    maxWaitMillis="-1"/>
      </Context>
      

三、完善你的HibernateUtil类

从你给出的片段来看,需要把buildSessionFactory方法补全,不同Hibernate版本写法略有差异:

针对Hibernate 5.x及以上版本(推荐)

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {
    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // 加载Hibernate配置文件(默认读取resources下的hibernate.cfg.xml)
            Configuration configuration = new Configuration().configure();
            // 构建服务注册中心,加载配置参数
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties()).build();
            // 创建SessionFactory
            return configuration.buildSessionFactory(serviceRegistry);
        } catch (Throwable ex) {
            System.err.println("SessionFactory初始化失败: " + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    // 应用关闭时关闭SessionFactory
    public static void shutdown() {
        getSessionFactory().close();
    }
}

针对Hibernate 4.x及以下版本

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            return new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            System.err.println("SessionFactory初始化失败: " + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void shutdown() {
        getSessionFactory().close();
    }
}

四、运行并测试应用

  1. 回到Run/Debug Configurations界面,选择你刚才配置的Tomcat实例,点击右上角的Run按钮启动服务器
  2. 编写测试代码验证Hibernate是否正常工作,比如一个简单的DAO测试:
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    public class TestDataSource {
        public static void main(String[] args) {
            Session session = null;
            Transaction tx = null;
            try {
                session = HibernateUtil.getSessionFactory().openSession();
                tx = session.beginTransaction();
                // 这里可以执行你的数据库操作,比如查询实体、保存数据等
                System.out.println("数据库连接成功!");
                tx.commit();
            } catch (Exception e) {
                if (tx != null) tx.rollback();
                e.printStackTrace();
            } finally {
                if (session != null) session.close();
                HibernateUtil.shutdown();
            }
        }
    }
    

常见问题排查

  • 如果出现javax.naming.NameNotFoundException,检查context.xml里的name属性是否和hibernate.cfg.xml中的connection.datasource一致,同时确认VM参数配置正确
  • 确保数据库驱动已经添加到项目依赖(比如Maven的pom.xml中添加驱动依赖,或者在IDEA的Project Structure里手动添加驱动库)
  • 查看Tomcat的日志输出(IDEA的Run控制台里会显示),根据具体错误信息定位问题,比如数据库连接失败可能是URL、用户名或密码错误

内容的提问来源于stack exchange,提问作者arun steven Henry

火山引擎 最新活动