2011-11-18 9 views
5

Tôi cố gắng triển khai bản demo sử dụng JBoss AS 7 với cơ sở dữ liệu mặc định có sẵn và JBoss AS. Việc thực hiện của tôi tương tự như ví dụ "login" của JBoss (tôi có một số dự án bổ sung để thực hiện một dịch vụ web và triển khai dưới dạng EAR) và tôi không thể nắm bắt được sự khác biệt. Dù sao tôi liên tục được Runtime Exceptions nhưKhông thể duy trì trạng thái hoạt động trong JBoss AS 7 ("Không thể tìm thấy một đơn vị triển khai có tên là subdeployment")

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 My

Manifest-Version: 1.0 
Dependencies: org.hibernate 

beans.xml của tôi là trống rỗng. Trong thư mục lib của tôi, tôi có các hibernate jars để có quyền truy cập vào các tính năng ngủ đông bản địa.

persistence.xml My

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

Và hai lớp có liên quan của tôi:

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(); 
    } 
} 

gì có thể gây ra ngoại lệ? Tôi nên tìm gì để giải quyết vấn đề này?

Trả lời

8

Tôi đã tìm thấy giải pháp. Tôi phải đặt persistence.xml vào thư mục META-INF của dự án EAR. Nếu tôi làm như vậy, tôi có thể sử dụng chú thích @PersistenceContext để lấy số EntityManager. Tôi nghĩ nó cũng hoạt động theo cách khác. Điều này có vẻ là một giải pháp, không phải là một giải pháp thực sự.

+0

Và trước đây 'persistence.xml' ở đâu? Trong thư mục META-INF của ejb-jar trong EAR? –

+12

Và đối với bất kỳ ai sử dụng chiến tranh, persistence.xml phải ở trong your_app_name \ src \ main \ resources \ META-INF, mất 1 giờ của tôi: ( – halil

+0

Xin chào, nhiều IDE (như intellij) tạo xml kiên trì trong thư mục WRONG nếu bạn đang sử dụng .war. – Goot

0

Bạn nên xác định một đơn vị tham khảo kiên trì trong tập tin web.xml lại myproject.persistence.war theo cách sau

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

Một sai lầm phổ biến làm điều này là để đánh sai tài liệu tham khảo nội dung <persistence-unit-name>, đây là một nguồn mà tạo ra này lỗi