JPA с TopLink: в пути к классам не найдено META-INF/persistence.xml

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.


person Switch    schedule 14.08.2009    source источник
comment
@oxbow_lakes - Вы могли бы это исправить :-) Я только что это сделал.   -  person ChssPly76    schedule 14.08.2009


Ответы (7)


У меня была та же проблема, я хранил свой файл persistence.xml в каталоге WebContent/META-INF, в то время как спецификация jpa говорит:
корнем модуля сохранения является каталог WEB-INF/classes; поэтому файл persistence.xml содержится в каталоге WEB-INF/classes/META-INF
попробуйте поместить файл persistence.xml в каталог src/META-INF.

person marcosbeirigo    schedule 11.03.2010
comment
в eclipse у меня сработало следующее: src/META-INF/persistence.xml - person Falaque; 29.10.2013

если вы используете IntelliJ или структуру проекта maven, вам нужно поместить весь файл "META-INF/persistence.xml" в папку ресурсов (src/resources), чтобы он переместил ваш файл persistence.xml в папку "WEB-INF/classes/persistence.xml".

если вы используете eclipse или что-то еще, внесите соответствующие изменения, чтобы переместить файл в WEB-INF/classes/persistence.xml

что-то еще не работало для меня.

person Aniruddha Das    schedule 04.04.2016

Ошибка несколько вводит в заблуждение. сам файл XML не должен не находиться в пути к классам; часть сообщения "META-INF/persistence.xml" означает, что каталог, содержащий META-INF/persistence.xml, должен быть.

Если на вашем жестком диске было следующее

C:\libs\JPA\META-INF\Persistence.xml

тогда ваш путь к классам должен включать это

CLASSPATH=c:\libs\JPA

Если META-INF\Persistence.xml содержался в foo.jar, предполагая, что META-INF/Persistence.xml находится в корневой папке jar, ваш путь к классам должен иметь это

CLASSPATH=C:\<path to jar>\foo.jar

Это может показаться очевидным или излишним, но моя цель состоит в том, чтобы убедиться, что мы сравниваем яблоки с яблоками, а CLASSPATH, наряду с загрузкой классов, может быть проблемой.

Итак, вы можете опубликовать свой CLASSPATH?

person Kelly S. French    schedule 14.08.2009
comment
Мой путь к классам настроен точно так, как вы упомянули выше. Но это все равно не сработает. - person Switch; 15.08.2009
comment
Находится ли Jar, содержащий реализацию IRCBotPU, в пути к классам? - person Kelly S. French; 15.08.2009

persistence.xml не должно быть в вашем пути к классам; JAR-файл, содержащий persistence.xml в папке META-INF, должен.

person ChssPly76    schedule 14.08.2009
comment
Как называется JAR-файл, содержащий META-INF/persistence.xml? Упомянут ли JAR в ваших приложениях CLASSPATH? - person Kelly S. French; 14.08.2009
comment
Нет, это не файл JAR. Я использую NetBeans 6.0, поэтому он просто создает пакет META-INF и внутри него файл persistence.xml. - person Switch; 14.08.2009

У меня есть веб-приложение, и следующее работает нормально. Что я сделал, так это добавил каталог META-INF с файлом persistence.xml в расположение src/main/resources [проект Maven]

person nu1silva    schedule 06.03.2012

Ваш файл 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>

Атрибут имени вашего модуля сохраняемости в файле persistence.xml не соответствует значению, которое вы передаете в метод Persistence.createEntityManagerFactory. Убедитесь, что для имени вашего сохраняемого модуля установлено значение «IRCBotPU».

person Community    schedule 14.08.2009

Я создал папку META-INF в src, и она работает. "marcosbeirigo" уже ответил на него. Я не знаю, почему я должен помещать туда этот файл persistence.xml. Я поставил его под WebContent/META-INF и не работал

person Wai Hein    schedule 06.12.2013
comment
Поскольку src находится в пути к классам, вот почему это сработало. - person Ben; 06.09.2016