1

我有一个带有 JPA 的小型测试应用程序,Hibernate 坚持到 Oracle XE。这一切都很好。

但是,当类路径包含 derby.jar 时,我得到一个异常,尽管我没有专门在 derby 中调用任何东西......我知道。

显然,德比正在尝试加载。但是我没有调用任何 Derby 初始化,也没有为 JPA 配置 Derby。根据 Derby 文档,“在嵌入式环境中,加载驱动程序也会启动 Derby。”

但我对德比没有任何要求。我从 persistence.xml 中删除了 derby persistence-unit。然而,随着 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)定义一个 persistence.xml,这样我就可以在一个测试工具中测试这两个数据库,以证明与即将推出的项目的兼容性在便携式机器上使用 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:密封违规”,这意味着它正在从同一个包中查找类安全管理器不允许的两个不同的 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.htmlhttp://docs.oracle.com/javadb/10.6.1.0/ref /rrefjdbc4_0summary.html了解此功能的小文档。

这个想法是您不必执行“Class.forName()”来加载驱动程序并将其注册到 DriverManager;现在自动发生了。

但一般不会造成任何问题;我很惊讶你在这里遇到了一个例外。

异常的完整堆栈跟踪是什么?您可以将整个内容剪切并粘贴到这个问题中吗?

禁用 JDBC 驱动程序自动加载没有简单的方法;最好弄清楚为什么它在您的情况下不起作用,并进行调整以使自动加载不会引发异常。

于 2012-09-15T15:25:21.287 回答