1

JPAを使用した小さなテストアプリがあり、HibernateはOracle XEに永続化されています。これはすべてうまくいきます。

ただし、クラスパスに derby.jar が含まれていると、例外が発生しますが、derby で特に何かを呼び出しているわけではありません... 私が知っていることです。

どうやら、Derby がロードしようとしているようです。しかし、私は Derby の初期化を呼び出しておらず、Derby が JPA 用に構成されていません。Derby のドキュメントによると、「組み込み環境では、ドライバーをロードすると Derby も起動します。」

しかし、私はダービーに何も要求していません。derby persistence-unit を persistence.xml から削除しました。しかし、derby.jar がパスに残っていると、爆発します。パスから derby.jar を削除すると、Oracle 用に定義された永続ユニットが正常に機能します。

Derby のドキュメントやオンラインで関連するものは何も見つかりませんでした。

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

クラスパスに derby.jar がある理由は、Oracle と Derby の 2 つの宣言を使用して persistence.xml を定義しようとしているからです。これにより、1 つのテスト ハーネスで 2 つのデータベースをテストして、次のプロジェクトの互換性を実証できます。 Oracle を社内で使用し、Derby をポータブル マシンで使用します。

持続性.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>
4

2 に答える 2

1

私もこの問題に遭遇しました。問題は、新しいクラスパスの前に古い derby.jar があったことです。古いものを取り除くしかありませんでした。

「Class.forName(org.apache.derby.jdbc.AutoloadedDriver40)」を実行する簡単なプログラムを作成しましたが、「java.lang.SecurityException: seal violation」で失敗しました。これは、同じパッケージからクラスを検索していたことを意味しますSecurity Manager が許可しない 2 つの異なる JAR (おそらく古いものと新しい derby.jar ファイル)。

于 2012-09-26T22:14:31.457 に答える
0

Derby JDBC ドライバーの自動ロードは、「JDBC ドライバーの自動ロード」と呼ばれる JDBC 4.0 機能によるものです。http://onjava.com/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.htmlおよびhttp://docs.oracle.com/javadb/10.6.1.0/refを参照してください。 /rrefjdbc4_0summary.htmlには、この機能に関するドキュメントがほとんどありません。

アイデアは、「Class.forName()」を実行してドライバーをロードし、それを DriverManager に登録する必要がないということです。それが自動的に行われるようになりました。

ただし、通常は問題は発生しません。ここで例外が発生していることに驚いています。

例外の完全なスタック トレースは何ですか? この質問にすべてをカット&ペーストできますか?

JDBC ドライバーの自動ロードを無効にする簡単な方法はありません。あなたのケースでなぜそれが機能しないのかを理解し、自動読み込みが例外をスローしないように調整することをお勧めします。

于 2012-09-15T15:25:21.287 に答える