问题描述
我被要求将大型独立 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>