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>