プロジェクトを作って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ファイル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>
/META-INF/persistence.xml
は、Webリソースではなく、ランタイムクラスパスで終了する必要があります。したがって、Webコンテンツフォルダではなく、Javaソースフォルダに配置する必要があります。 persistence.xml
はWebリソースに関連していませんが、Java Beanに関連しています。
上に移動します。
MyProject
|-- Java (src folder)
| |-- controller
| | `--ControllerServlet.Java
| |-- entity
| |-- session
| `-- META-INF
| `-- persistence.xml <-- Here.
`--WebContent
`-- WEB-INF
|-- view
| |-- category.jsp
| `-- etc..
`-- index.jsp
このようにして、ビルドは/META-INF/persistence.xml
内に/WEB-INF/classes
を含む適切なWAR構造を生成します。 Eclipseを使用しているようですが、プロジェクトのプロパティでJPAファセットを選択することでもこれを実現できます。
このようにして、Eclipseは適切な場所にpersistence.xml
を生成します。
persistence.xml
がMETA-INF
に存在するとおっしゃいました。このアプリケーションをWAR
ファイルとしてデプロイする場合は、persistence.xml
を次のようにパッケージ化する必要があります。
WEB-INF
`- classes
`- META-INF
`- persistence.xml`
JPA 2.0仕様 によると、セクション8.2 Persistence Unit Packaging:
永続性ユニットは、persistence.xmlファイルによって定義されます。 META-INFディレクトリにpersistence.xmlファイルが含まれているjarファイルまたはディレクトリは、永続ユニットのルートと呼ばれます。 Java EE環境では、永続ユニットのルートは次のいずれかである必要があります。
•EJB-JARファイル
•WARファイルのWEB-INF/classesディレクトリ
•WARファイルのWEB-INF/libディレクトリにあるjarファイル
•EARライブラリディレクトリ内のjarファイル
•アプリケーションクライアントのjarファイル永続性ユニットにEJB-JARまたはWARに含まれるクラスに加えて永続性クラスが含まれる場合を除き、永続性ユニットを含むEJB-JARまたはWARファイルをEARにパッケージ化する必要はありません。
プロジェクトの構造が正しくないためです。 ejbとWebアプリケーション用に2つの別々のパーツを作成し、それらをEARにパックするか、CDIを使用します。 JPA(EntityManagerFactoryが含まれている)は、アプリケーションのコンテナーによってアクティブ化されないだけです。
エンタープライズアプリケーションの場合:
http://www.youtube.com/watch?v=32wpTh1TmY4
CDIの場合:
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)
それを解決するにはI 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
下にあるglassfishdomain.xmlをコピーします
<glassfish server install> glassfish\domains\domain1\config to src\test\glassfish\domains\domain1\config.
上記の手順に従って問題を解決しました。