it-swarm.com.ru

Невозможно исправить Java.lang.IllegalStateException: невозможно получить EntityManagerFactory для unitName

Я пытаюсь изучить JSP и сервлеты, делая проект. Моя цель - НЕ концентрироваться на JPA, ORM и постоянстве .__ или даже EJB на данный момент. Поэтому, пожалуйста, не говорите мне читать учебник или книгу по этому вопросу. К сожалению, я не должен Использовать SQL-запросы для взаимодействия с базой данных. Вместо этого я использовал предварительно написанный код JPA для управления постоянством В то время как я сосредоточился на jsp и сервлетах. 

Когда я запускаю свой проект, я получаю сообщение об ошибке - Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU.Мой проект находится по адресу -https://github.com/double-whammy/affablebean.git Скачать в формате Zip Кнопка находится в правом нижнем углу.

Note - Мой файл persistence.xml IS в папке META-INF. Я проверил и построил свой проект снова. Так что причина может быть исключена.

Я погуглил, и ни одно из решений не помогло. Как я могу исправить эту ошибку? 

MyProject
|
|__Java (src folder)
|    |
|    |__controller (package)
|    |   |__ControllerServlet.Java
|    |
|    |__entity (entity classes here) 
|    |__session (facade classes for each entity class)
|
|   
|__WebContent
    |
    |__WEB-INF
         |
         |__view
         |    |__category.jsp        
         |    |
         |    |etc...
         |
         |__index.jsp

Исключение:

Time|Info: Redirecting to /index.jsf
Time|Info: Admin Console: Initializing Session Attributes...
Time|Warning: EJB5184:A system exception occurred during an invocation on EJB CategoryFacade, 
method: public Java.util.List session.AbstractFacade.findAll()
Time|Warning: javax.ejb.EJBException
at com.Sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.Java:748)
at com.Sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.Java:698)
at com.Sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.Java:503)
at com.Sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.Java:4475)
at com.Sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.Java:2009)
at com.Sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.Java:1979)
at com.Sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.Java:220)
at com.Sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.Java:88)
at com.Sun.proxy.$Proxy193.findAll(Unknown Source)
at session.__EJB31_Generated__CategoryFacade__Intf____Bean__.findAll(Unknown Source)
at controller.ControllerServlet.init(ControllerServlet.Java:31)
at javax.servlet.GenericServlet.init(GenericServlet.Java:244)
at org.Apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.Java:1583)
at org.Apache.catalina.core.StandardWrapper.allocate(StandardWrapper.Java:1212)
etc ................................................... etc...
at Java.lang.Thread.run(Thread.Java:745) 

Caused by: Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.Java:138)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.Java:171)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.Java:834)
at session.AbstractFacade.findAll(AbstractFacade.Java:41)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
etc ................................................... etc...
at com.Sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.Java:212)
... 33 more

Time|Severe: WebModule[/AffableBean]StandardWrapper.Throwable
javax.ejb.EJBException
at com.Sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.Java:748)
at com.Sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.Java:698)
at com.Sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.Java:503)
etc ................................................... etc...
at session.__EJB31_Generated__CategoryFacade__Intf____Bean__.findAll(Unknown Source)
at controller.ControllerServlet.init(ControllerServlet.Java:31)
at javax.servlet.GenericServlet.init(GenericServlet.Java:244)
at org.Apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.Java:1583)
at org.Apache.catalina.core.StandardWrapper.allocate(StandardWrapper.Java:1212)
etc ................................................... etc...
at Java.lang.Thread.run(Thread.Java:745)

Caused by: Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.Java:138)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.Java:171)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.Java:834)
at session.AbstractFacade.findAll(AbstractFacade.Java:41)
etc ................................................... etc...
at com.Sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.Java:212)
... 33 more

Time|Warning: StandardWrapperValve[ControllerServlet]: Allocate exception for servlet ControllerServlet
Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.Java:138)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.Java:171)
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.Java:834)
at session.AbstractFacade.findAll(AbstractFacade.Java:41)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
etc ................................................... etc...

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="AffableBeanPU"
    transaction-type="JTA">
    <jta-data-source>jdbc/affablebean</jta-data-source>
    <properties>
        <property name="eclipselink.logging.level" value="FINEST" />
    </properties>
</persistence-unit>
</persistence>
15
james

/META-INF/persistence.xml должен заканчиваться в пути к классам времени выполнения, а не в веб-ресурсах. Итак, вам нужно поместить его в исходную папку Java, а не в папку веб-содержимого. persistence.xml относится не к веб-ресурсам, а к бинам Java.

Переместите это вверх:

MyProject
 |-- Java (src folder)
 |    |-- controller
 |    |    `--ControllerServlet.Java
 |    |-- entity
 |    |-- session
 |    `-- META-INF
 |         `-- persistence.xml <-- Here.
 `--WebContent
     `-- WEB-INF
          |-- view
          |    |-- category.jsp        
          |    `-- etc..
          `-- index.jsp

Таким образом, сборка создаст правильную структуру WAR с /META-INF/persistence.xml внутри /WEB-INF/classes. Похоже, вы используете Eclipse, вы также можете достичь этого, выбрав фасет JPA в свойствах проекта.

enter image description here

Таким образом, Eclipse сгенерирует persistence.xml в нужном месте.

enter image description here

15
BalusC

Вы упоминаете, что ваш persistence.xml присутствует в META-INF. Если вы развертываете это приложение в виде файла WAR, ваш persistence.xml должен быть упакован как

WEB-INF
 `- classes
     `- META-INF
         `- persistence.xml`

В соответствии со спецификацией JPA 2.0 , раздел 8.2 Упаковка единицы измерения сохраняемости:

Персистентная единица определяется файлом persistence.xml. Файл jar или каталог, каталог META-INF которого содержит файл persistence.xml файл называется корнем единицы сохраняемости. В Java EE В средах корень персистентной единицы должен быть одним из следующий: 

• файл EJB-JAR
• каталог WEB-INF/classes файла WAR
• файл jar в каталоге WEB-INF/lib файла WAR
• файл jar в каталоге библиотеки EAR
• jar-файл приложения-клиента 

Не требуется, чтобы файл EJB-JAR или WAR содержал блок персистентности должен быть упакован в EAR, если блок персистентности содержит классы персистентности в дополнение к классам, содержащимся в EJB-JAR или WAR.

4
Robby Cornelissen

Потому что ваш проект имеет неправильную структуру. Создайте две отдельные части для ejb и веб-приложения, затем упакуйте их в EAR или используйте CDI. JPA (частью которого является EntityManagerFactory) просто не активируется контейнером для вашего приложения.

Для корпоративных приложений:

http://www.youtube.com/watch?v=32wpTh1TmY4

Для CDI:

http://www.hascode.com/2011/02/creating-a-sample-Java-ee-6-blog-application-with-jpa-ejb-cdi-jsf-and-primefaces-on-glassfish/

2
Alex Chernyshev

У меня была похожая проблема с сервером Embedded Glassfish, вызванная: 

Java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName cis_ejbPU
at com.Sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.Java:132)

РЕШИТЬ ЭТО Я DID СЛЕДУЮЩИЙ

1) В pom.xml добавьте следующие зависимости

      <dependency>
                <groupId>org.glassfish.extras</groupId>
                <artifactId>glassfish-embedded-all</artifactId>
                <version>3.2-b06</version>
                <scope>provided</scope>
            </dependency>

       <dependency>
           <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
                </dependency>

2) Настройте свойства HashMap для встроенного контейнера.

    File target = prepareModuleDirectory();
             Map<String, Object> properties = new HashMap<String, Object>();
             properties.put(EJBContainer.MODULES, target);

             properties.put("org.glassfish.ejb.embedded.glassfish.installation.root", "./src/test/glassfish/");
             properties.put("org.glassfish.ejb.embedded.glassfish.configuration.file", "./src/test/glassfish/domains/domain1/config/domain.xml");
    container = javax.ejb.embeddable.EJBContainer.createEJBContainer(properties);

3)

        private static final String MODULE_NAME = "embedded";
        private static final String TARGET_DIR = "target/" + MODULE_NAME;


    private static File prepareModuleDirectory() throws IOException {
        File result = new File(TARGET_DIR);
        FileUtils.copyDirectory(new File("target/classes"), result);
        FileUtils.copyFile(new File("target/test-classes/META-INF/persistence.xml"),
                new File(TARGET_DIR + "/META-INF/persistence.xml"));
        return result;
    }

4) создать структуру папок под 

src\test\glassfish\domains\domain1\config 

и скопируйте glassfish domain.xml, который присутствует в 

<glassfish server install> glassfish\domains\domain1\config  to src\test\glassfish\domains\domain1\config.

Я следовал за вышеупомянутыми шагами, чтобы решить проблему.

1
Madhu Pisipati