如何在初始化Hibernate之前使Spring加载JDBC驱动程序';什么是SessionFactory?

如何在初始化Hibernate之前使Spring加载JDBC驱动程序';什么是SessionFactory?,hibernate,spring,loading,jdbc,Hibernate,Spring,Loading,Jdbc,我正在开发一个Spring(2.5.6)+Hibernate(3.2.6)web应用程序来连接自定义数据库。为此,我有定制的JDBC驱动程序和Hibernate方言。我确信这些自定义类是有效的(在我的单元测试中是硬编码的) 我想,问题在于Spring加载对象的顺序。 基本上: 自定义数据库初始化 Spring从web.xml加载bean Spring加载ServletBeans(applicationContext.xml) Hibernate启动:显示正确加载的版本和所有属性 Hibernat

我正在开发一个Spring(2.5.6)+Hibernate(3.2.6)web应用程序来连接自定义数据库。为此,我有定制的JDBC驱动程序和Hibernate方言。我确信这些自定义类是有效的(在我的单元测试中是硬编码的)

我想,问题在于Spring加载对象的顺序。 基本上:

  • 自定义数据库初始化
  • Spring从web.xml加载bean
  • Spring加载ServletBeans(applicationContext.xml)
  • Hibernate启动:显示正确加载的版本和所有属性
  • Hibernate的HbmBinder运行(映射我的所有类)
  • LocalSessionFactoryBean-构建新的Hibernate SessionFactory
  • DriverManager连接提供程序-在CustomDBURL处使用驱动程序:MyCustomJDBCDriver
  • 我得到一个SQLException:找不到适合CustomDBURL的驱动程序
  • Hibernate加载自定义方言
  • 我的CustomJDBCDriver最终向DriverManager注册(日志消息)
  • 设置工厂运行
  • SchemaExport运行(hbm2ddl)
  • 我得到一个SQLException:没有为CustomDBURL找到合适的驱动程序(又是?!)
  • 已成功部署应用程序,但自定义数据库中没有表
  • 到目前为止我尝试过的事情:

    • 传递hibernate属性的不同技术:嵌入“sessionFactory”bean中,从hibernate.properties文件加载。没有任何效果,但我没有尝试使用hibernate.cfg.xml文件,也没有尝试使用数据源bean
    • MyCustomJDBCDriver有一个静态初始值设定项块,它自己向DriverManager注册
    • 尝试了Springbean的不同延迟初始化组合(lazy init=“true”),但没有任何效果
    我的自定义JDBC驱动程序应该是第一个加载的东西-不确定是否由Spring加载,但是

    有没有人能给我一个解决办法,或者给我一个提示,告诉我还有什么可以尝试的?如果有帮助的话,我可以提供更多细节(例如巨大的堆栈跟踪)


    提前感谢。

    如果Hibernate负责获取数据库连接,则Hibernate属性为
    Hibernate.connection.driver\u类
    属性

    就你而言:

    hibernate.connection.driver_class = CustomJDBCDriver 
    

    如果Hibernate负责获取数据库连接,则Hibernate属性为
    Hibernate.connection.driver\u类
    属性

    就你而言:

    hibernate.connection.driver_class = CustomJDBCDriver 
    

    你在哪种环境下看到这个问题?spring上下文感知单元测试?jboss部署?(这可能是一个类加载器问题:例如,您使用的jboss发行版在servers/ctxt/lib中包含hibernate,并且驱动程序库在您的war中吗?)。事实上,它比这要复杂一点:Jetty运行在一个处理单元(PU)的容器中。因此,PU启动的时间比它创建和启动Jetty容器的时间要长。Jetty完成其余工作(WebAppContext稍后向PU注册)。我如何跟踪我的CustomJDBCDriver加载在哪个类加载器上以及Spring加载在哪个类加载器上?谢谢最后,我的一位同事为我找到了解决办法。正如@Thierry提到的,这是一个类装入器问题。我正在用Spring库部署我的应用程序,但处理单元已经加载了这些库(Jetty的lib文件夹)。所以他们发生了冲突。我找到的解决方案是将CustomJDBCDriver.jar放在Spring jar所在的同一文件夹中(jetty lib文件夹或apps/WEB-INF/lib中),并确保只有一个。就这样!谢谢大家!你在哪种环境下看到这个问题?spring上下文感知单元测试?jboss部署?(这可能是一个类加载器问题:例如,您使用的jboss发行版在servers/ctxt/lib中包含hibernate,并且驱动程序库在您的war中吗?)。事实上,它比这要复杂一点:Jetty运行在一个处理单元(PU)的容器中。因此,PU启动的时间比它创建和启动Jetty容器的时间要长。Jetty完成其余工作(WebAppContext稍后向PU注册)。我如何跟踪我的CustomJDBCDriver加载在哪个类加载器上以及Spring加载在哪个类加载器上?谢谢最后,我的一位同事为我找到了解决办法。正如@Thierry提到的,这是一个类装入器问题。我正在用Spring库部署我的应用程序,但处理单元已经加载了这些库(Jetty的lib文件夹)。所以他们发生了冲突。我找到的解决方案是将CustomJDBCDriver.jar放在Spring jar所在的同一文件夹中(jetty lib文件夹或apps/WEB-INF/lib中),并确保只有一个。就这样!谢谢大家!嗨,skaffman,我已经完全按照您所说的方式包含了driver_类-我可以看到它被加载到Hibernate日志中-并且驱动程序被加载并注册到DriverManager。所以这还不是我问题的答案。无论如何,谢谢。嗨,skaffman,我已经按照你所说的方式加入了driver_类-我可以看到它被加载到Hibernate日志中-驱动程序被加载并注册到DriverManager。所以这还不是我问题的答案。无论如何,谢谢你。