JPA с TopLink: METP-INF/persistence.xml не найден в classpath
public class LoginTest {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("IRCBotPU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Login lg = new Login();
lg.setPassword("password");
lg.setUserName("Rocky");
em.persist(lg);
em.flush();
Login st = em.find(Login.class, lg.getPassword());
System.out.println(st);
em.getTransaction().commit();
em.close();
emf.close();
}
}
Я получаю исключение, когда пытаюсь запустить этот класс
javax.persistence.PersistenceException: No Persistence provider for EntityManager named IRCBotPU:
No META-INF/persistence.xml was found in classpath.
META-INF/persistence.xml находится в моем классе. Я не знаю, в чем причина или это исключение.
Постоянная библиотека - TopLink.
7 ответов
У меня была та же проблема, я держал свой файл persistence.xml в каталоге WebContent/META-INF, в то время как спецификация jpa гласит:
корнем модуля персистентности является каталог WEB-INF/classes; поэтому файл persistence.xml содержится в каталоге WEB-INF/classes/META-INF
попробуйте поместить файл persistence.xml в src/META-INF.
Если вы используете IntelliJ
или структура проекта Maven вам нужно разместить весь "META-INF/persistence.xml"
файл в папке in resources(src/resources), чтобы он persistence.xml
подать в "WEB-INF/classes/persistence.xml"
место нахождения.
если вы используете eclipse
или что-то еще вносит соответствующие изменения, чтобы файл переместился в WEB-INF/classes/persistence.xml
что-то еще не работает для меня.
Ошибка несколько вводит в заблуждение. сам файл XML не должен находиться в пути к классам; часть сообщения "META-INF/persistence.xml" означает, что каталог, содержащий META-INF / persistence.xml, должен быть.
Если на вашем жестком диске было следующее
C:\ ЛИЭС \JPA\ META-INF \ persistence.xml
тогда ваш classpath должен включать это
CLASSPATH=c:\libs\JPA
Если META-INF\Persistence.xml содержался в файле foo.jar, предполагая, что META-INF/Persistence.xml находится в корневой папке jar, ваш путь к классам должен иметь это
CLASSPATH=C:\<path to jar>\foo.jar
Это может показаться очевидным или излишним, но моя цель - убедиться, что мы сравниваем яблоки с яблоками, и CLASSPATH, наряду с загрузкой классов, может быть проблемой для решения.
Итак, вы можете опубликовать свой CLASSPATH?
persistence.xml
не должно быть в вашем классе; JAR-файл, который содержит persistence.xml
в своей папке META-INF следует.
У меня есть веб-приложение, и следующее работало нормально. Я добавил каталог META-INF с файлом persistence.xml в папку src/main/resources [проект Maven]
Я создал папку с именем META-INF под src, и она работает. "Marcosbeirigo" уже ответил на это. Я не знаю, почему я должен поместить туда этот файл persistance.xml. Я поместил его в WebContent/META-INF и не работал
Ваш файл META-INF/persistence.xml должен выглядеть примерно так:
// <persistence>
// <persistence-unit name="IRCBotPU">
// <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
// <!-- All persistence classes must be listed -->
// <class>entity.Customer</class>
// <class>entity.Order</class>
// <class>entity.Item</class>
// <properties>
// <!-- Provider-specific connection properties -->
// <property name="toplink.jdbc.driver" value="<database driver>"/>
// <property name="toplink.jdbc.url" value="<database url>"/>
// <property name="toplink.jdbc.user" value="<user>"/>
// <property name="toplink.jdbc.password" value="<password>"/>
// <!-- Provider-specific settings -->
// <property name="toplink.logging.level" value="INFO"/>
// </properties>
// </persistence-unit>
// </persistence>
Атрибут name вашего модуля постоянства в файле persistence.xml не соответствует значению, которое вы передаете в метод Persistence.createEntityManagerFactory. Убедитесь, что ваше имя персистентного устройства установлено в "IRCBotPU".