2012-09-15 40 views
1

我有一個JPA的小測試應用程序,Hibernate堅持Oracle XE。這一切工作正常。未配置Derby.jar異常?

但是,當classpath包含derby.jar時,雖然我沒有專門調用derby中的任何東西,但我知道這個異常。

顯然,德比試圖加載。但是我沒有調用任何Derby初始化,也沒有爲JPA配置Derby。根據Derby文檔,「在嵌入式環境中,加載驅動程序也啓動了Derby。」

但我沒有向德比請求任何東西。我從persistence.xml中刪除了derby持久化單元。然而,隨着derby.jar的繼續前行,它會爆炸。如果從路徑中刪除derby.jar,則爲Oracle定義的持久性單元可以正常工作。

我發現在德比文檔或在線沒有任何相關的。

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.AutoloadedDriver40 

我之所以在類路徑中的derby.jar是,我試圖定義有兩個聲明,Oracle和德比的persistence.xml,這樣我就可以在一個測試工具測試兩個數據庫演示即將推出的項目的兼容性,該項目將在便攜式機器上使用Oracle內部和Derby。

的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
<persistence-unit name="persistenceUnit"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.gdeb.swift.NIIN</class> 
    <class>com.gdeb.swift.RIC</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" /> 
     <property name="javax.persistence.jdbc.user" value="swift" /> 
     <property name="javax.persistence.jdbc.password" value="swift" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe" /> 
     <property name="oracle.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
     <property name="hibernate.max_fetch_depth" value="3" /> 
    </properties> 
</persistence-unit> 
</persistence> 

回答

0

Derby JDBC驅動程序自動加載的是由於所謂的 「JDBC驅動程序自動加載」 一個JDBC 4.0功能。有關此功能的小文檔,請參閱http://onjava.com/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.htmlhttp://docs.oracle.com/javadb/10.6.1.0/ref/rrefjdbc4_0summary.html

這個想法是,你不必做一個'Class.forName()'來加載你的驅動程序並註冊它與DriverManager;現在自動發生。

但它通常不會引起任何問題;我很驚訝你在這裏得到一個例外。

什麼是異常的完整堆棧跟蹤?你可以剪切和粘貼到這個問題的整個事情?

有沒有簡單的方法來禁用JDBC驅動程序自動加載;最好弄清楚爲什麼它不適用於你的情況,並且調整一些東西以便自動加載不會引發異常。

1

我也遇到了這個問題。在我的類路徑中發佈新的derby.jar之前,發佈一個新的。我只需要刪除舊的。

我寫了一個簡單的程序來做'Class.forName(org.apache.derby.jdbc.AutoloadedDriver40)',它失敗了一個「java.lang.SecurityException:密封違規」,這意味着它正在尋找類來自安全管理器不允許的兩個不同JAR中的相同程序包(可假設較舊和較新的derby.jar文件)。

相關問題