2017-05-26 18 views
2

我動態加載驅動程序JDBC。它工作正常,但是這DriverManager變得無用,當我嘗試打開一個Hibernate會話如何爲Hibernate動態加載驅動程序?

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. 爲什麼它不工作與休眠,但與jdbc?
  2. 如何解決?
+1

參考https://stackoverflow.com/questions/44346826/database-driver-class-dynamic-loading,看看喬布斯的答案,它可以幫助你 – harshavmb

+0

謝謝。這是一個真正的答案 –

回答

1

答案是Hibernate將嘗試從上下文(當前線程)類加載器加載驅動程序,並且它沒有驅動程序。第一部分的工作原理是因爲您使用具有驅動程序的類加載器來創建連接。

的解決方案是使用操縱上下文類加載器。當使用加載的驅動程序出口的方法時,請不要忘記清理它。

+0

非常感謝你+1。你可以分享一些代碼嗎? –

1

到您問題的方法可能是這樣的:

想法是有自己的類加載器,並使用該ClassLoader類你的初始化你Hibernate SessionFactory

像在此之前:

Thread.currentThread().setContextClassLoader(myOwnClassLoader); 

儘管這不是解決您的問題的最佳解決方案之一,但事實就是如此。雖然this是一個不完整的討論,它仍然是足夠有用的給你指點繼續。

希望這有助於!