Объект постоянства не может найти единицу сохранения из файла persistence.xml - PullRequest
3 голосов
/ 14 декабря 2010

Среда: Windows 7, NetBean 6.9 (включая GlassFish v3, Java EE 6), сервер MySQL

Я создал таблицы в базе данных MySQL и использовал возможности NetBean, щелкнув правой кнопкой мыши по проекту и выбрав «create entity from database» (извините, если формулировка неверна, потому что мой NetBean на японском языке)

Это создаст сущности.

Теперь я пошел проверить, могу ли я получить доступ к БД через Entity Manager.

Tmp.java

package local.test.tmp;
import Resources.Users;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import java.util.List;
/**
 *
 * @author m-t
 */
public class Tmp {

    private static EntityManagerFactory factory;
    private static final String WEB_PU = "WebApplication1PU";

    public static void main(String args[]) {
        factory = Persistence.createEntityManagerFactory(WEB_PU);
        EntityManager em = factory.createEntityManager();
        //read existing entries and write to concole
        Query q = em.createQuery("select * from users");

        List<Users> userList = q.getResultList();
        for(Users u : userList) {
            System.out.println(u);
        } 
    }
}

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
  <!--   orignal
  <persistence-unit name="WebApplication1PU" transaction-type="JTA">
    <jta-data-source>masatoJNDI</jta-data-source>
    <properties/>
  </persistence-unit>
  -->

  <persistence-unit name="WebApplication1PU" transaction-type="JTA">
    <jta-data-source>masatoJNDI</jta-data-source>
    <properties>
        <property name="toplink.jdbc.user" value="masato" />
        <property name="toplink.jdbc.password" value="foobar" />
    </properties>
  </persistence-unit>
</persistence>

Когда я запускаю Tmp.java, я вижу, что он не работает по адресу:

factory = Persistence.createEntityManagerFactory(WEB_PU);

Сообщение об ошибке:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence 
provider for EntityManager named WebApplication1PU
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:84)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at local.test.tmp.Tmp.main(Tmp.java:24)

Я проверил написание модуля персистентности "WebApplication1PU" в тестовом коде, совпадающего с файлом persistence.xml, и это правильно.

persistence.xml находится ... это на японском, я не знаю, как на английском: (

Позвольте мне попробовать ..

project
 |-------web page
 |-------test package
 |-------lib
 |-------enterprise bean
 |-------*** file  //blah file, I can't translate..
               |-----MNIFEST.MF
               |-----faces-cofig.xml
               |-----persistence.xml  //HERE!!

Поскольку сбой происходит в начале, когда Factory пытается найти модуль персистентности в файле persistence.xml, я полностью сбит с толку. Есть что-нибудь, что я должен проверить?

пожалуйста, дайте мне знать, если вам нужно больше разъяснений.

UPDATE

Я пытался предложить возможные решения, но не повезло .. Возвращается то же сообщение об ошибке. Да, поставщиком по умолчанию для Netbean 6.9 является toplink.

Что я сделал:

Добавлен провайдер в файл persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">

  <persistence-unit name="NoJSFPU" transaction-type="JTA">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <jta-data-source>masatoJNDI</jta-data-source>

    <properties>
        <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/mytest"/>
        <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="toplink.jdbc.user" value="masato" />
        <property name="toplink.jdbc.password" value="mocha123" />
    </properties>
  </persistence-unit>
</persistence>

Похоже, что большинство людей добиваются успеха в моей ситуации. Теперь я начинаю думать, что может быть проблема с тем, как я запускаю тестовый файл или где он находится?

Tmp.java, который я запускаю из netbean, находится по адресу:

project
|------web page
|------source package
|          |-----------local.test.session
           |-----------local.test.tmp
                           |------------------Tmp.java //HERE

Хотя я не уверен, имеет ли это значение.

ОБНОВЛЕНИЕ 2

Я добавил toplink lib, содержащую toplink-essential.jar и toplink-essential-agent.jar, в каталог lib моего проекта, и теперь я получаю новую ошибку поверх оригинальной, но я полагаю, что получаю ближе.

Похоже, что у атрибута version в persistence.xml есть проблема ... ???

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named WebApplication1PU: Provider named oracle.toplink.essentials.PersistenceProvider threw unexpected exception at create EntityManagerFactory: 
oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException
Local Exception Stack: 
Exception [TOPLINK-30005] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: sun.misc.Launcher$AppClassLoader@f6a746
Internal Exception: Exception [TOPLINK-30004] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException
Exception Description: An exception was thrown while processing persistence.xml from URL: file:/C:/Users/m-takayashiki/Documents/NetBeansProjects/NoJSF/build/web/WEB-INF/classes/
Internal Exception: 
(1. cvc-complex-type.3.1: Value '2.0' of attribute 'version' of element 'persistence' is not valid with respect to the corresponding attribute use. Attribute 'version' has a fixed value of '1.0'.)
        at oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:143)
        at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createEntityManagerFactory(EntityManagerFactoryProvider.java:169)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:110)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
        at local.test.tmp.Tmp.main(Tmp.java:24)

ОБНОВЛЕНИЕ 3

После некоторых исследований выяснилось, что номер версии должен соответствовать 1.0, поэтому я применил исправление и получил новую ошибку.

 <?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="NoJSFPU" transaction-type="JTA">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <jta-data-source>masatoJNDI</jta-data-source>
    <class>local.test.session.Addresses</class>
    <class>local.test.session.Users</class>
    <properties>
        <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/mytest"/>
        <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="toplink.jdbc.user" value="masato" />
        <property name="toplink.jdbc.password" value="mocha123" />
    </properties>
  </persistence-unit>
</persistence>

Это странно, потому что я уже указал класс в файле persistence.xml выше: (

Exception in thread "main" javax.persistence.PersistenceException: Exception [TOPLINK-7060]
 (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.ValidationException
Exception Description: Cannot acquire data source [masatoJNDI].
Internal Exception: javax.naming.NoInitialContextException: Need to specify class name in
 environment or system property, or as an applet parameter, or in an application resource 
file:  java.naming.factory.initial

ОБНОВЛЕНИЕ 4

Я не думаю, что это называется "решено", но после долгой попытки я решил просто запустить свой тестовый код в веб-приложении вместо того, чтобы запускать его по отдельности из netbean. Я должен был создать web.xml сам, так как GlassFish не предоставляет его. (Я вижу sun-web.xml, но это не была замена) Затем создал сервлет, определил отображение в web.xml, добавил мой фрагмент кода теста в сервлет и попробовал в браузере. Работало, успешно получал данные из базы.

Интересно, почему это не работает, когда я пытаюсь запустить только Tmp.java (мой тестовый файл) из Netbean ...

Ответы [ 4 ]

5 голосов
/ 14 декабря 2010

Пожалуйста, укажите <provider> для вашего <persistence-unit>:

<!-- EclipseLink -->
<provider>
  org.eclipse.persistence.jpa.PersistenceProvider
</provider>

<!-- Hibernate -->
<provider>
  org.hibernate.ejb.HibernatePersistence
</provider>

<!-- Toplink -->
<provider>
 oracle.toplink.essentials.PersistenceProvider
</provider>

и укажите правильное имя persistence-unit, а путь к файлу также находится в правильном пути контекста.

2 голосов
/ 14 декабря 2010

Я думаю, что вам, возможно, потребуется указать вашего постоянного поставщика. Смотрите здесь .

Например:

<provider>org.hibernate.ejb.HibernatePersistence</provider>

или

<provider>oracle.toplink.essentials.PersistenceProvider</provider>

Ваш «оригинальный» модуль персистентности полагается на сервер для связи в деталях, таких как провайдер, но когда вы запускаете его вне контекста сервера, вам нужно указать несколько вещей - одна из них - провайдер.

См. здесь .

0 голосов
/ 25 ноября 2016

Я думаю, вам может понадобиться добавить контекст jndi, вам следует создать файл jndi.properties в вашем jar-файле и добавить в него содержимое ниже.

java.naming.factory.initial=bitronix.tm.jndi.BitronixInitialContextFactory
0 голосов
/ 05 марта 2015

Я предполагаю, что проблема заключается в следующей строке:

<jta-data-source>masatoJNDI</jta-data-source>

, которая, если вы не работаете в контексте с поддержкой JNDI, вызовет тип ошибки, который вы изначально видели.Попробуйте создать файл persistence.xml в папке test / resources и удалить эту строку в тестовой версии файла xml.

...