首页 > 解决方案 > 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 驱动程序来做同样的事情,但结果相同。

非常欢迎任何帮助!

标签: jpadatabase-connectioneclipselinkpersistence.xml

解决方案


我发现了问题。这是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>

推荐阅读