2011-11-18 59 views
5

我試圖實現一個演示,該演示使用帶有JBoss AS默認的休眠和默認數據庫的JBoss AS 7。我的實現類似於來自JBoss的「登錄」示例(我有一些額外的項目來實現Web服務並將其部署爲EAR),我無法發現其中的差異。無論如何,我不斷地得到運行時例外,如無法在JBoss AS 7中獲得持久性(「無法在子部署中找到名爲的部署單元)

Caused by: java.lang.RuntimeException: Can't find a deployment unit named at subdeployment "myproject.persistence.war" of deployment "myproject.ear" 
    at org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.getScopedPUName(WeldJpaInjectionServices.java:94) [jboss-as-weld-7.0.2.Final.jar:7.0.2.Final] 
    at org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.resolvePersistenceContext(WeldJpaInjectionServices.java:59) [jboss-as-weld-7.0.2.Final.jar:7.0.2.Final] 
    at org.jboss.weld.util.Beans.injectEEFields(Beans.java:784) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] 

我的MANIFEST.MF

Manifest-Version: 1.0 
Dependencies: org.hibernate 

我beans.xml裏是空的。在我的lib文件夾中,我有hibernate jars可以訪問本地休眠功能。

我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence 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" 
    version="2.0"> 
    <persistence-unit name="accessControlDatabase"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> 
     <properties> 
      <property name="hibernate.hbm2ddl.auto" value="create-drop" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

和我的兩個相關類:

import javax.enterprise.inject.Produces; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

public class Resources { 
    @SuppressWarnings("unused") 
    @Produces 
    @PersistenceContext(name = "accessControlDatabase") 
    private EntityManager em; 
} 

import java.util.List; 

import javax.enterprise.context.RequestScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 
import javax.persistence.EntityManager; 

import myproject.model.Session; 
import myproject.model.User; 

@Named("accessControlRepository") 
@RequestScoped 
public class AccessControlRepository { 
    @Inject 
    private EntityManager em; 

    @SuppressWarnings("unchecked") 
    public List<Session> getAllSessions() { 
     return em.createQuery("from Session").getResultList(); 
    } 
} 

什麼會導致異常?我應該尋找什麼來解決問題?

回答

8

我找到了解決辦法。我必須將persistence.xml放入EAR項目的文件夾中。如果我這樣做,我可以使用@PersistenceContext註釋來獲得EntityManager。我認爲它也應該以另一種方式工作。這似乎是一種解決方法,而不是真正的解決方案。

+0

以前的'persistence.xml'在哪裏?在EAR中的ejb-jar的META-INF目錄中? –

+12

對於任何使用war的人來說,persistence.xml應該在your_app_name \ src \ main \ resources \ META-INF中,這花了我1個小時:( – halil

+0

嗨,許多IDE的(像intellij)在WRONG文件夾中創建持久xml '使用.war。非常有幫助評論 – Goot

0

您應該通過以下方式在web.xml文件myproject.persistence.war定義持久化單元引用

<persistence-unit-ref> 
    <persistence-unit-ref-name>myprojectPersistenceUnit/pu</persistence-unit-ref-name> 
    <persistence-unit-name>../myproject.name.jar#myprojectPersistenceUnit</persistence-unit-name> 
</persistence-unit-ref> 

一個常見的錯誤這樣做是拼錯了<persistence-unit-name>內容的參考,這是產生這個源錯誤

相關問題