2014-07-22 20 views
14

我想通過製作一個項目來學習JSP和servlet。我的目標不是專注於JPA,ORM和持久性 甚至是現在的EJB。所以,請不要告訴我閱讀教程或書籍。不幸的是,我不認爲 使用SQL查詢與數據庫進行交互。相反,我使用預先編寫的JPA代碼來管理持久性 ,同時我專注於jsp和servlet。無法修復java.lang.IllegalStateException:無法檢索unitName的EntityManagerFactory

當我跑我的項目,我得到的錯誤 - java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName AffableBeanPU. 我的項目是位於 -https://github.com/double-whammy/affablebean.git 作爲壓縮文件下載按鈕位於右下角。

注意 - 我的persistence.xml文件在META-INF文件夾內。我再次檢查並構建了我的項目。 所以這個原因可以排除。

我使用Google搜索,沒有任何解決方案有幫助。我如何解決這個錯誤?

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> 
+0

你有沒有在你的服務器上正確設置Datasource jdbc/affablebean?這個問題可能與此有關。嘗試僅注入數據源,並查看是否可以獲得連接。 – Gas

+0

@氣體 - 是的,數據源設置正確。我實際上使用我的數據源在JSP內部運行了SQL查詢。之後, 我應該用EJB代碼替換SQL,那就是問題開始的時候。我想主要關注jsp和servlets上的 ,現在我不得不學習EJB,這幾乎是一種死硬的技術。 – james

+0

您將這部署到什麼servlet容器? – anon

回答

2

因爲你的項目有不正確的結構。爲ejb和web應用程序創建兩個單獨的部分,然後將它們打包成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/

+0

你是什麼意思?爲ejb和web應用程序創建兩個單獨的部分,然後將它們打包成EAR或使用CDI。請告訴我什麼是企業應用程序和CDI,有什麼區別。這些對我來說是新的。我從中做出我的代碼的教程沒有提到這一點。我的項目結構是根據教程。不確定是否會導致問題。謝謝。 – james

+1

簡單一點 - 只需在Netbeans/Eclipse中創建新的企業項目並查看將生成的內容。 http://docs.oracle.com/javaee/5/tutorial/doc/figures/overview-applicationModule.gif –

3

你提到你的persistence.xml存在於META-INF。如果您正在部署該應用程序爲WAR文件,您persistence.xml需要被包裝成

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

按照JPA 2.0 specification,部分8.2持久性單元包裝

的持久化單元定義由一個persistence.xml文件。 jar文件 或其META-INF目錄包含persistence.xml 文件的目錄稱爲持久性單元的根。在Java EE 環境,持久化單元的根必須是 之一以下:

•一個EJB-JAR文件
•WAR文件
的WEB-INF/classes目錄•一個jar文件在WAR文件
•在EAR庫目錄jar文件的WEB-INF/lib目錄
•應用客戶端jar文件

不要求含有 ,一個EJB-JAR或WAR文件持久性單元被封裝在EAR中,除非持久化單元t 除了包含在EJB-JAR或WAR中的 中包含的那些類,還包含持久性類。

11

/META-INF/persistence.xml必須以運行時類路徑而不是網絡資源結束。所以,你需要把它放在Java源文件夾中,而不是放在Web內容文件夾中。 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 

這樣的構建將產生內部/WEB-INF/classes/META-INF/persistence.xml正確的WAR結構。您似乎正在使用Eclipse,您還可以通過選擇項目屬性中的JPA構面來實現此目的。

enter image description here

這樣Eclipse會產生一個persistence.xml在正確的地方。

enter image description here

+0

感謝您的回答Balus。我沒有再次面對這個問題,因爲我開始在一個新系統上開發。在新的sys中,我瘋狂搜索,發現你需要使用JPA facets。不知道這是否是我的項目工作的原因。沒有重現錯誤。我通過了這個問題的錯誤,並得到了許多其他骯髒的錯誤。我現在使用NetBeans開發相同的代碼,這是本教程的原始IDE。到目前爲止,它的工作完美。 – james

+1

正如所回答的那樣,'/ META-INF/persistence.xml'必須在運行時類路徑中,而不是在web資源中。您的問題是由於您在網絡資源中引起的。在使用JPA構面時(或者在正確的位置手動創建文件夾和過濾器),它會在Java源文件夾中結束,最終會在運行時類路徑中結束。 – BalusC

0

我與嵌入式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 pro嵌入式容器

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)perties下

src\test\glassfish\domains\domain1\config 

創建文件夾結構和

<glassfish server install> glassfish\domains\domain1\config to src\test\glassfish\domains\domain1\config. 
下複製了GlassFish domain.xml中,其存在

我fo採取了上述步驟解決問題。