Eclipselink JPA 3.0 和独立数据库的连接错误

问题描述

我被要求将大型独立 Swing 应用程序的数据库连接 jar 从 Eclipselink JPA 2.0 迁移到 Eclipselink JPA 3.0 实现。

我看到一个很大的不同:Eclipselink 3.0 使用 Jakarta。 在这一点上我要做的就是连接到数据库,但到目前为止我一直没有成功,我不知道为什么。 这是我的测试课:

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;

public class Main
{
    public static void main( String[] argv )
    {
        EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "FlexDB" );
        EntityManager entityManager = emfactory.createEntityManager( );
    
        entityManager.close();
        emfactory.close();
        System.out.println( "Hello World!" );
     }
}

当我运行这个时,我得到这个异常。

Exception in thread "main" jakarta.persistence.PersistenceException: Exception [EclipseLink-4021] 
(Eclipse Persistence Services - 3.0.0.v202012081010):
org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Unable to acquire a connection from driver [null],user [null] and URL [null].  
Verify that you have set the expected driver class and URL.  Check your login,persistence.xml or 
sessions.xml resource.  The jdbc.driver property should be set to a class that is compatible with 
your  database platform

异常告诉我我的 persistence.xml 或我正在使用的 jar 文件有问题,但我一直无法确定是什么。

这是我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">

<persistence-unit name="FlexDB" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:"/>
        <property name="javax.persistence.jdbc.user" value="sa"/>
        <property name="javax.persistence.jdbc.password" value="" />
        <property name="eclipselink.target-database" 
              value="org.eclipse.persistence.platform.database.H2Platform"/>
        <property name="eclipselink.logging.level" value="INFO" />
    </properties>
    </persistence-unit>
</persistence>

这是我的依赖项(来自我的 pom.xml maven 文件):

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>3.0.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
</dependency>

<!-- https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api -->
<dependency>
    <groupId>jakarta.persistence</groupId>
    <artifactId>jakarta.persistence-api</artifactId>
    <version>3.0.0</version>
</dependency>

我在调试器中运行了连接代码,看起来persistence.xml 正在被正确地找到和解析。 创建实体管理器工厂的调用返回。 当我尝试获取 EntityManager 时发生异常。看起来像 EclipseLink 尝试创建会话时的情况。 我还尝试使用 Derby 驱动程序执行相同的操作,但结果相同。

非常欢迎任何帮助!

解决方法

我发现了问题。这是persistence.xml 文件。 我通过将persistence.xml 中'javax' 的每个实例更改为'jakarta' 来解决这个问题。 然后persistence.xml 变成了这个。 eclipselink 网站上的文档中肯定已经提到了这一更改,但我没有看到。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">

        <persistence-unit name="FlexDB" transaction-type="RESOURCE_LOCAL">
                <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
                <exclude-unlisted-classes>true</exclude-unlisted-classes>
                <properties>
                        <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
                        <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:"/>
                        <property name="jakarta.persistence.jdbc.password" value="sa"/>
                        <property name="jakarta.persistence.jdbc.user" value=""/>
                        <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.H2Platform"/>
                </properties>
        </persistence-unit>
</persistence>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...