JPA Jakarta EE
В предыдущем посте мы вскольз упоминали про JPA и Java EE. Мне прислали несколько вопрос про ошибки с JPA при апгрейде проекта. Суть довольно проста. Проект собирается и развёртывается без ошибок, но при обращении к БД получаем следующие ошибки
jakarta.persistence.PersistenceException: Unable to locate persistence units
Caused by: jakarta.persistence.PersistenceException: Invalid persistence.xml.
Error parsing XML [line : -1, column : -1] : cvc-elt.1.a: Cannot find the declaration of element ‘persistence’.
org.glassfish.jersey.server.ContainerException: java.util.concurrent.ExecutionException: jakarta.persistence.PersistenceException: Unable to locate persistence units
Caused by: java.util.concurrent.ExecutionException: jakarta.persistence.PersistenceException: Unable to locate persistence units
Что ж, давайте разберем этот вопрос более детально. Мы имеем рабочий в версии Java EE 7 файл описание подключения к БД web.xml:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" 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_1.xsd"> <persistence-unit name="itnotepadsql" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>com.itnotepad.MainPersistence</class> <class>com.itnotepad.ReciterModel</class> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/itnotepad"/> <property name="javax.persistence.jdbc.user" value="username"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.password" value="somethingpassword"/> </properties> </persistence-unit> </persistence>
Теперь мы немного изменим xml в соответствии с обновленным пространством имен:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="3.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"> <persistence-unit name="itnotepadsql" transaction-type="RESOURCE_LOCAL"> <class>com.itnotepad.MainPersistence</class> <class>com.itnotepad.ReciterModel</class> <properties> <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/itnotepad"/> <property name="jakarta.persistence.jdbc.password" value="somethingpassword"/> <property name="jakarta.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="jakarta.persistence.jdbc.user" value="username"/> </properties> </persistence-unit> </persistence>
И перед сборкой смотрим на обновленный список зависимостей:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>jakarta.transaction</groupId> <artifactId>jakarta.transaction-api</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.jpa</artifactId> <version>3.0.1</version> </dependency>