2010-05-11 61 views
1

我正在開發Spring(2.5.6)+ Hibernate(3.2.6)Web應用程序以連接到自定義數據庫。爲此我定製了JDBC驅動程序和Hibernate方言。我確定這些自定義類可以工作(在我的單元測試中硬編碼的東西)。如何在初始化Hibernate的SessionFactory之前讓Spring加載JDBC驅動程序?

我想這個問題與Spring上加載事件的順序有關。 基本上是:

  1. 自定義數據庫初始化從web.xml中
  2. 彈簧負荷豆
  3. 彈簧負載ServletBeans(applicationContext.xml中)
  4. 休眠踢:顯示版本和所有屬性正確加載。
  5. Hibernate的HbmBinder運行(映射我的所有類)
  6. 的LocalSessionFactoryBean - 構建新的SessionFactory
  7. DriverManagerConnectionProvider - 使用驅動程序:MyCustomJDBCDriver在CustomDBURL
  8. 我得到的SQLException:發現CustomDBURL
  9. 沒有合適的驅動程序
  10. 休眠加載自定義語言
  11. 我的CustomJDBCDriver最終獲得DriverManager註冊(日誌消息)
  12. SettingsFactory運行
  13. 的SchemaExport運行(就是hbm2ddl)
  14. 我得到的SQLException:發現CustomDBURL沒有合適的驅動程序(一次?)
  15. 申請得到成功部署,但也有我的自定義數據庫沒有表。

的事情,我試過到目前爲止:

  • 不同的技術傳遞休眠特性:嵌入'的sessionFactory bean實例,從hibernate.properties文件加載。沒有任何工作,但我沒有嘗試用hibernate.cfg.xml文件既沒有數據源bean。
  • MyCustomJDBCDriver有一個靜態初始化程序塊,它可以用DriverManager自行註冊。
  • 嘗試了Spring bean的延遲初始化(lazy-init =「true」)的不同組合,但沒有任何工作。

我的自定義JDBC驅動程序應該是第一個要加載的東西 - 不知道是否由Spring發佈,但是......!

任何人都可以給我一個解決方案,或者我可以嘗試什麼暗示?如果有幫助,我可以提供更多的細節(例如巨大的堆棧跟蹤)。

在此先感謝。

+0

在其環境在你看到這個問題?春季情境感知單元測試? jboss部署? (這可能是一個類加載器的問題:你是否使用jboss分發包括在服務器/ ctxt/lib中的休眠和驅動程序庫在你的戰爭?) – Thierry 2010-05-11 15:53:09

+0

嗨Thierry,我想部署應用程序在本地Jetty服務器進行測試。實際上,比這更復雜一點:Jetty運行在一個處理單元(PU)的容器內。因此,PU開始比創建並啓動Jetty容器。 Jetty完成剩下的工作(WebAppContext稍後在PU中註冊)。我如何跟蹤我的CustomJDBCDriver被加載的類加載器和Spring的類加載器? 謝謝! – 2010-05-12 09:21:39

+0

最後,我的一位同事在工作中爲我找到了解決方案。正如@Thierry所說,這是一個類加載器問題。我正在用Spring庫部署我的應用程序,但處理單元已經加載了(Jetty的lib文件夾)。所以他們有衝突。我找到的解決方案是將我的CustomJDBCDriver.jar放在Spring jar(jetty lib文件夾或apps/WEB-INF/lib)所在的文件夾中,並確保只有一個。就是這樣!謝謝大家! – 2010-05-13 10:22:41

回答

1

如果Hibernate負責獲取數據庫連接,那麼休眠屬性needs to includehibernate.connection.driver_class屬性。

你的情況:

hibernate.connection.driver_class = CustomJDBCDriver 
+0

嗨skaffman, 我已經包含了driver_class,就像你說的那樣 - 我可以看到它在Hibernate日誌上加載 - 並且驅動程序被加載並註冊到DriverManager中。所以這不是我的問題的答案。 無論如何,謝謝。 – 2010-05-12 08:57:44

相關問題