【问题标题】:Can not obtain connection to DB using JPA - derby embedded driver class missing无法使用 JPA 获得与 DB 的连接 - 缺少 derby 嵌入式驱动程序类
【发布时间】:2021-05-25 14:12:32
【问题描述】:

我正在尝试使用 jpa 创建本地 derby 数据库。作为 JPA 实现,我使用 openjpa 和 sql 实现 derby。

这是persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="DataLayer"
        transaction-type="RESOURCE_LOCAL">
        <non-jta-data-source>DataSource</non-jta-data-source>
        <properties>
            <property
                name="javax.persistence.schema-generation.database.action"
                value="create" />
            <property name="javax.persistence.jdbc.driver"
                value="org.apache.derby.jdbc.EmbeddedDriver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:derby:testdb" />
        </properties>
    </persistence-unit>
</persistence>

这是我的主要内容:

public static void main(String[] args)
{
    Persistence.generateSchema("DataLayer", null);
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("DataLayer");
    EntityManager manager = factory.createEntityManager(); // <- Exception here
}

这是我得到的异常的开始部分:

Exception in thread "main" <openjpa-3.1.2-r66d2a72 nonfatal general error> org.a
pache.openjpa.persistence.PersistenceException: There were errors initializing y
our configuration: <openjpa-3.1.2-r66d2a72 fatal user error> org.apache.openjpa.
util.UserException: A connection could not be obtained for driver class "org.apa
che.derby.jdbc.EmbeddedDriver" and URL "jdbc:derby:testdb".  You may have spe
cified an invalid URL.
...

说我可能指定了无效的 URL。

完整的堆栈跟踪:https://justpaste.it/3kmgo

根异常:java.lang.ClassNotFoundException:org.apache.derby.jdbc.EmbeddedDriver

我在persistence.xml中指定了EmbeddedDriver,还包含了Maven依赖。

根据有关 derby 的文档,我认为我的连接 url 和驱动程序是正确的:

包含的依赖项(使用 Maven):

<dependency>
    <groupId>org.apache.openjpa</groupId>
    <artifactId>openjpa</artifactId>
    <version>3.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>10.15.2.0</version>
</dependency>

我尝试将属性 javax.persistence.jdbc.url 更改为 jdbc:derby:testdb;create=true,但同样的例外。还尝试将javax.persistence.schema-generation.database.action 属性设置为none

【问题讨论】:

  • 请注意,您使用的是 Derby 10.15,但您的问题表明您正在阅读 Derby 版本 10.4 和 10.8 的文档,这些文档已经很旧了。在您发布的错误消息中,它显示“EmbeddeasddDriver”——该值是什么以及它是如何到达那里的?这是线索吗?
  • @BryanPendleton 哦,我的……对不起,我编辑了问题。我可能是错误地在那里写了“asd”。我检查了那些文档 10.15,替换了它们,但连接性的东西保持不变。
  • 好,有道理。尝试获取异常的完整任务跟踪。我对 Maven 的功能不是很熟悉,但我怀疑您的 CLASSPATH 中没有正确的 jar。特别是,您可能缺少 derbyshared.jar。在此处阅读 DERBY-6945 发行说明:db.apache.org/derby/releases/release-10.15.1.3.html
  • @BryanPendleton 我已经包含了我对该问题的异常的完整堆栈跟踪。根本例外是缺少 EmbeddedDriver 类,因为您怀疑我的类路径中没有正确的 jar。更改了问题名称。但是,我已经在 persistence.xml 中指定了该类并包含了 Maven 依赖项:/
  • 我认为你的“artifactid”是错误的。我认为“derbyclient”是针对 Derby 的客户端-服务器网络配置的。由于您使用的是 derby 的嵌入式配置,请尝试将 'derby' 指定为 artifactid。

标签: java maven jpa database-connection derby


【解决方案1】:

发现 org.apache.derby.jdbc.EmbeddedDriver 类不在 derby artifactid 依赖项中(它有 derby 和 derbyshared jar 的)。它在 derbytools 中,因此将 derbytools 包含在依赖项中可以解决缺少 EmbeddedDriver 类的问题:

<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derbytools</artifactId>
    <version>10.15.2.0</version>
</dependency>

【讨论】:

  • 很高兴你知道了!
【解决方案2】:

使用 Debry 10.15.2.0,嵌入式驱动程序位于 Derbytools.jar。因此必须在您的库和类路径中。创建了一个新的驱动程序(我删除了任何嵌入的驱动程序)。在服务选项卡中,右键单击驱动程序并新建。添加 Derbytools.jar 突出显示它并单击 Find 按钮。给它一个有意义的名字,它就会按预期工作。为了确保我还添加了 Derby.jar 和 DerbyShared.jar 以避免出现问题。

【讨论】:

  • OP 使用 maven 管理依赖关系;您似乎在描述如何在某些 IDE 中添加依赖项,这与问题无关。不过,您的解决方案的要点(添加 derbytools)是正确的 - 但 Wortig 已经弄清楚了。
猜你喜欢
  • 1970-01-01
  • 2011-04-20
  • 2021-12-27
  • 2021-06-24
  • 2021-05-23
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多