【发布时间】:2010-05-11 15:04:22
【问题描述】:
我正在开发一个 Spring(2.5.6)+Hibernate(3.2.6) Web 应用程序来连接到自定义数据库。为此,我有自定义 JDBC 驱动程序和休眠方言。我确信这些自定义类可以工作(我的单元测试中的硬编码内容)。
我猜,问题在于 Spring 加载内容的顺序。 基本上:
- 自定义数据库初始化
- 从 web.xml 加载 bean
- Spring 加载 ServletBeans(applicationContext.xml)
- Hibernate 启动:显示正确加载的版本和所有属性。
- Hibernate 的 HbmBinder 运行(映射我的所有类)
- LocalSessionFactoryBean - 构建新的 Hibernate SessionFactory
- DriverManagerConnectionProvider - 在 CustomDBURL 使用驱动程序:MyCustomJDBCDriver
- 我得到一个 SQLException:没有为 CustomDBURL 找到合适的驱动程序
- Hibernate 加载自定义方言
- 我的 CustomJDBCDriver 终于在 DriverManager 中注册(日志消息)
- SettingsFactory 运行
- SchemaExport 运行 (hbm2ddl)
- 我得到一个 SQLException:没有为 CustomDBURL 找到合适的驱动程序(再次?!)
- 应用程序已成功部署,但我的自定义数据库中没有表。
到目前为止我尝试过的事情:
- 传递休眠属性的不同技术:嵌入在“sessionFactory”bean 中,从 hibernate.properties 文件加载。没有任何效果,但我还没有尝试使用 hibernate.cfg.xml 文件,也没有使用 dataSource bean。
- MyCustomJDBCDriver 有一个静态初始化程序块,可将它自己注册到 DriverManager。
- 尝试了 Spring bean 的延迟初始化 (lazy-init="true") 的不同组合,但没有任何效果。
我的自定义 JDBC 驱动程序应该是第一个加载的东西 - 不确定是否由 Spring 但是......!
谁能给我一个解决方案或者提示我可以尝试什么?如果有帮助,我可以提供更多详细信息(例如巨大的堆栈跟踪)。
提前致谢。
【问题讨论】:
-
您在哪个环境中看到了这个问题?春季上下文感知单元测试? jboss 部署? (这可能是一个类加载器问题:例如,您是否使用了 jboss 发行版,该发行版在 servers/ctxt/lib 中包含 hibernate 并且驱动程序库在您的战争中?)
-
您好 Thierry,我正在尝试将应用程序部署在本地 Jetty 服务器中进行测试。实际上,比这更复杂一点:Jetty 在一个处理单元(PU)的容器内运行。因此,PU 启动比它创建和启动 Jetty 容器。 Jetty 完成其余的工作(WebAppContext 稍后在 PU 中注册)。如何跟踪我的 CustomJDBCDriver 正在加载哪个类加载器以及 Spring 是哪个类加载器?谢谢!
-
我的一位同事终于为我找到了解决方案。正如@Thierry 提到的,这是一个类加载器问题。我正在使用 Spring 库部署我的应用程序,但处理单元已经加载了那些(Jetty 的 lib 文件夹)。所以他们发生了冲突。我找到的解决方案是将我的 CustomJDBCDriver.jar 放在 Spring jar 所在的同一文件夹中(jetty lib 文件夹或来自应用程序 /WEB-INF/lib),并确保只有一个。就是这样!谢谢大家!
标签: hibernate spring loading jdbc