2011-11-18 1 views
5

JBoss AS와 함께 제공되는 기본 최대 절전 모드 및 기본 데이터베이스와 함께 JBoss AS 7을 사용하는 데모를 구현하려고합니다. 내 구현은 JBoss의 "로그인"예제와 비슷합니다 (웹 서비스를 구현하고 EAR로 배포하기위한 몇 가지 추가 프로젝트가 있습니다). 어쨌든 나는 끊임없이 내 beans.xml 환경이 비어 등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 

으로 런타임 예외를 얻을. 내 lib 폴더에서 최대 절전 기능을 기본 항아리 기능에 액세스 할 수있는 항아리가 있습니다.

내 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.xmlEAR 프로젝트의 META-INF 폴더에 넣어야합니다. 그렇게하면 @PersistenceContext 특수 효과를 사용하여 EntityManager에 도달 할 수 있습니다. 나는 그것이 다른 방식으로도 효과가 있어야한다고 생각합니다. 이것은 해결책이 아닌 실제 해결책 인 것 같습니다.

+0

이전에 'persistence.xml'은 어디에 있었습니까? EAR 내에서 ejb-jar의 META-INF 디렉토리에 있습니까? –

+12

그리고 전쟁을 사용하는 사람은 persistence.xml이 your_app_name \ src \ main \ resources \ META-INF에 있어야합니다. 내 1 시간이 걸립니다. ( – halil

+0

안녕하세요, 많은 IDE (intellij와 같은)가 WRONG 폴더에 지속성 XML을 만듭니다. .war를 사용하고 있습니다. 매우 도움이되는 설명 – Goot

0

당신은 일반적인 실수는 이것이 <persistence-unit-name> 내용의 참조를 잘못 입력하는 일이이를 생성하는 소스

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

다음과 같은 방법으로 myproject.persistence.war 당신의 web.xml 파일에 퍼시스턴스 유닛 참조를 정의해야합니다 오류

관련 문제