【问题标题】:How to load driver dynamically for Hibernate?如何为 Hibernate 动态加载驱动程序?
【发布时间】:2017-05-26 17:40:22
【问题描述】:

我正在为 JDBC 动态加载驱动程序。它工作正常,但是当我尝试打开休眠会话时,这个 DriverManager 变得无用了

org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver could not be loaded 

这里是代码

    public class TestHibernateSessionFactory {


        public void test() throws MalformedURLException, InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException { 
        URL u = new URL("jar:file:/C:\\Users\\...\\mysql-connector-java-5.1.40-bin.jar!/");
        String classname = "com.mysql.jdbc.Driver";
        URLClassLoader ucl = new URLClassLoader(new URL[] { u });
        Driver d = (Driver)Class.forName(classname, true, ucl).newInstance();
        DriverManager.registerDriver(new DriverLoader(d));


        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306", "admin", "password"); 

    // this is the proof that DriverManager loaded and works fine
        System.out.println("CONNECTION OBJECT WORKS FINE: " + con);

    // Now I want to try this same technique with hibernate     
        Session session = null; 
        Transaction tx = null; 

        SessionFactory sf = buildSessionFactory("jdbc:mysql://localhost:3306", "admin", "password"); 

// ERROR  Specified JDBC Driver com.mysql.jdbc.Driver could not be loaded  WHY ??? 
            session = sf.openSession(); 
            System.out.println(session);     
        }

        private static SessionFactory buildSessionFactory(String myUrl, String myUser, String myPass) {

            Configuration configuration = new Configuration();
            configuration.configure();

            configuration.setProperty("hibernate.connection.url", myUrl);
            configuration.setProperty("hibernate.connection.username", myUser);
            configuration.setProperty("hibernate.connection.password", myPass); 
            configuration.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"); 
            configuration.setProperty("hibernate.hbm2ddl.auto", "create-drop"); 

            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); 

            return configuration.buildSessionFactory(serviceRegistry);
    }

    }

两个问题:

  1. 为什么它不能与 hibernate 一起使用,而与 jdbc 一起使用?
  2. 如何解决?

【问题讨论】:

标签: java hibernate jdbc


【解决方案1】:

答案是 Hibernate 将尝试从上下文(当前线程)类加载器加载驱动程序,但它没有驱动程序。第一部分有效,因为您使用具有驱动程序的类加载器来创建连接。

解决方案可能是使用操作上下文类加载器。只是不要忘记在使用已加载驱动程序的方法退出时对其进行清理。

【讨论】:

  • 非常感谢+1。你能分享一些代码吗
【解决方案2】:

解决问题的方法可能是这样的:

想法是拥有自己的类加载器并在初始化 Hibernate SessionFactory 之前使用您的 ClassLoader

像这样:

Thread.currentThread().setContextClassLoader(myOwnClassLoader);

虽然这不是解决您的问题的最佳解决方案之一,但事实就是如此。尽管this 是一个不完整的讨论,但它仍然足够有用,可以为您提供继续前进的指导。

希望对你有帮助!!!

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多