2015-03-04 3 views
0

я следующая структуру веб-приложении (войны), работающее на JBoss EAP 6.1 с JPA 2 и Hibernate 4.2:JPA лицо из внешней баночки не найдено в войне

  • Entity.jar (от другого внутреннего проекта)
  • Application.war (содержащий Entity.jar в WEB-INF/Lib, включены как Maven зависимость, а не как специалист модуля)

в моем проекте веб-приложения (Application.war) у меня есть EJB содержащий EntityManager. В EJB я хотел бы создать JQL-Query (em.createQuery) для Entity из Entity.jar.

Если я вызываю метод EJB, содержащий запрос, я получил ошибку:

Caused by: javax.ejb.EJBException: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [SELECT u FROM User as u WHERE u.name = :name] 

Моя сущность Пользователь из Entity.jar выглядит как:

@Entity 
@Table(name = "PL1_USER") 
public class User implements Serializable { 
... 

EJB из Application.war :

@Stateless 
public class UserService { 

@PersistenceContext(unitName = "my-unit") 
private EntityManager entityManager; 

public User getUser(String username) { 
    TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User as u WHERE u.name = :name", User.class); 
    query.setParameter("name", username); 
    return query.getSingleResult(); 
} 
} 

persistence.xml из Application.war (WEB-INF/классы/META-INF):

<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="my-unit" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:jboss/datasource/MY-DS</jta-data-source> 

    <jar-file>Entity.jar</jar-file> 

    <properties> 
     <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /> 
     <property name="hibernate.archive.autodetection" value="class, hbm" /> 
     <property name="hibernate.show_sql" value="false" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="hibernate.use_sql_comments" value="false" /> 
     <property name="hibernate.jdbc.batch_size" value="30" /> 
     <property name="hibernate.jdbc.fetch_size" value="100" /> 
     <property name="hibernate.max_fetch_depth" value="0" /> 
     <property name="hibernate.order_updates" value="true" /> 
     <property name="hibernate.use_identifier_rollback" value="true" /> 

     <!-- JDBC Driver returns row count for batch statements --> 
     <property name="hibernate.jdbc.batch_versioned_data" value="true" /> 

     <property name="hibernate.dialect" value="org.hibernate.dialect.DB2400Dialect" /> 

    </properties> 
</persistence-unit> 

Структура Application.war:

- Application.war 
    - META-INF 
     - MANIFEST.MF (containing Entity.jar in Class-Path) 
    - resources 
    - WEB-INF 
     - com 
      - example 
       - UserService.class 
     - classes 
      - META-INF 
       - persistence.xml 
     - lib 
      - Entity.jar 
    - index.xhtml 

Если Вам необходима дополнительная информация/подробности, пожалуйста, дайте мне знать.

Я уже искал в google, но ничего, что я нашел, работал для меня.

Я очень рад, если кто-нибудь может мне помочь.

ответ

0

Книга Pro JPA2 отмечает следующее о включении объектов из JAR-файлов:

При перечислении баночки в банке-файл элементе, он должен быть указан по отношению к родителю файла JAR в , который в Файл META-INF/persistence.xml находится. Это соответствует тому, что вы поместили бы в classpath запись в манифесте. Например, предположим, что корпоративный архив (EAR), который мы будем называть emp.ear, составляет , как показано в листинге 13-5.

Листинг 13-5. Объекты во внешнем JAR

  • emp.ear
    • эми-ejb.jar
      • META-INF/persistence.xml
    • Библиотека/EMP-classes.jar
      • примеры/модель/работник.Класс

содержимое файла persistence.xml должно быть таким, как показано в листинге 13-6, с JAR-файл, содержащий элемент «Библиотека/EMP-classes.jar» для ссылки emp-classes.jar в каталоге lib в файле EAR . Это приведет к тому, что провайдер добавит аннотированные классы, которые он нашел в emp-classes.jar (Employee.class) в блок персистентности, а поскольку банка находится в каталоге lib EAR, то будет автоматически загружаться в приложение CLASSPATH.

Листинг 13-6. Содержание persistence.xml

<persistence-unit name="EmployeeService"> 
<jta-data-source>java:app/jdbc/EmployeeDS</jta-data-source> 
<jar-file>lib/emp-classes.jar</jar-file> 
</persistence-unit> 
+0

На данный момент у меня нет уха (это только война), но я уже пытался установить значение jar-файла в «lib/Entity.jar» без успеха. Является ли ушной файл единственным способом его запуска? – marco235

+0

Вам нужно будет обновить вопрос с помощью структуры вашего развернутого приложения. –

+0

Я добавил структуру Application.war к вопросу. – marco235

0

Проблема, кажется, в ссылке на JBoss-развертывания-structure.xml. Entity.jar также используется для механизма входа (JAAS) для Application.war, и поэтому тот же Entity.jar доступен как модуль EAP и включен в jboss-deployment-structure.xml Application.war.

Возможно, JBoss EAP игнорирует Entity.jar в каталоге lib Application.war, поскольку он уже объявлен в jboss-deployment-structure.xml и включен через модуль EAP.

Смежные вопросы