Не удалось исправить 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-кнопку в нижнем правом углу.
Примечание. Мой файл persistence.xml находится внутри папки META-INF. Я проверил и снова построил свой проект.
Поэтому можно исключить причину.
Я googled, и ни одно из решений не помогло. Как исправить эту ошибку?
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>
Ответы
Ответ 1
/META-INF/persistence.xml
должен закончиться в пути пути выполнения, а не в веб-ресурсах. Таким образом, вам нужно поместить его в исходную папку Java, а не в папку веб-содержимого. persistence.xml
не связан с веб-ресурсами, а с Java beans.
Переместите его вверх:
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]()
Ответ 2
Вы отмечаете, что ваш 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.
Ответ 3
Потому что ваш проект имеет неправильную структуру. Создайте две отдельные части для 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/
Ответ 4
У меня была аналогичная проблема с сервером 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)
ПОСТАНОВИТЬ ЭТО Я СЛЕДУЮЩИЙ
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
и скопируйте domain.xml glassfish, который присутствует в
<glassfish server install> glassfish\domains\domain1\config to src\test\glassfish\domains\domain1\config.
Я выполнил следующие шаги, чтобы решить проблему.