Java 如何为Hibernate动态加载驱动程序?
我正在为JDBC动态加载驱动程序。它工作正常,但是当我尝试打开hibernate会话时,这个Java 如何为Hibernate动态加载驱动程序?,java,hibernate,jdbc,Java,Hibernate,Jdbc,我正在为JDBC动态加载驱动程序。它工作正常,但是当我尝试打开hibernate会话时,这个DriverManager就变得无用了 org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver could not be loaded 这是密码 public class TestHibernateSessionFactory {
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);
}
}
两个问题:
答案是Hibernate将尝试从上下文(当前线程)类加载器加载驱动程序,但它没有驱动程序。第一部分之所以有效,是因为您使用具有驱动程序的类加载器来创建连接
解决方案可以是使用操作上下文类加载器。当使用加载的驱动程序的方法退出时,不要忘记清理它 解决问题的方法可能是这样的: 想法是在初始化
Hibernate SessionFactory
像这样:
Thread.currentThread().setContextClassLoader(myOwnClassLoader);
虽然这不是解决您的问题的最佳解决方案之一,但事实就是如此。虽然这是一个不完整的讨论,但它仍然非常有用,可以为您提供继续进行的指导
希望这有帮助 非常感谢你。请分享一些代码参考,看看乔布斯的答案,这可能会帮助你谢谢。这是一个真实的答案