Неизвестная сущность в EAR с единицей сохранения в другом jar

#java #maven #jpa #ear #persistence-unit

#java #maven #jpa #ear #единица сохранения

Вопрос:

Например, у меня есть EAR с модулем WAR, некоторыми модулями EJB и некоторыми JARS:

 EAR
 - moduleEjb.jar
 - moduleWeb.war
 -lib
      - entity.jar
      - resource.jar
  

Я хочу использовать единицы сохранения из resource.jar таким образом, модули ejb независимы от среды (я должен помнить только имя PU, я могу изменить jndi для источника данных в resource.jar без изменений moduleEjb.jar ), но сущности не найдены.

Объект находится в entity.jar:

 @Entity
@Table(name = "ttracciatikettle", indexes = {...})
@NamedQueries({...})
public class TTracciatoKettle extends EntityBaseGest implements Serializable { ... }
  

единица сохранения находится в resource.jar

 <?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="myPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:/jboss/datasource/mydata</jta-data-source>
    <jar-file>../entity.jar</jar-file>
    <properties>
        <property name="javax.persistence.schema-generation.database.action" value="create"/>
        <property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/>
        <property name="eclipselink.logging.level" value="ALL"/>
        <property name="eclipselink.logging.level.sql" value="ALL"/>
        <property name="javax.persistence.sql-load-script-source" value="META-INF/defaultdata.sql"/>
    </properties>
</persistence-unit>
  

и диспетчер сущностей используется в moduleEjb.jar внутри EJB:

 @PersistenceContext(unitName = "myPU")
private EntityManager em;

@Override
public TTracciatoKettle findByCodice(String codice) throws BadRequestException{
    try{
        //return this.em.createNamedQuery("TTracciatoKettle.findByCodice", entityClass)
        return this.em.createQuery("SELECT t FROM TTracciatoKettle t WHERE t.codice = :codice", entityClass)
                .setParameter("codice", codice)
                .getSingleResult();
    }catch(NoResultException ne){
        return null;
    }catch(NonUniqueResultException nure){
        ...
    }
}
  

Даже если я использую именованный запрос или jpql, я получаю сообщение об ошибке

[14, 30] Тип абстрактной схемы ‘TTracciatoKettle’ неизвестен.

[39, 47] Путь к полю состояния ‘t.codice’ не может быть преобразован в допустимый тип.

Запускается модуль сохранения myPU, а также успешно вызывается сценарий загрузки. Если я использую тот же PU, но внутри модуля ejb, он работает

Комментарии:

1. Вы пробовали использовать `@PersistenceContext (имя_элемента = «lib / resource.jar#myPU»)?

2. @ujulu Я только что попробовал, тот же результат: (

Ответ №1:

В соответствии со структурой каталогов, которые вы разместили в jar entity.jar и resource.jar которые находятся в том же каталоге: lib . Таким jar-file образом, запись в persistence.xml файле должна быть:

 <jar-file>entity.jar</jar-file>
  

я начинаю

 <jar-file>../entity.jar</jar-file>
  

С сохраняемым архивом (jar, содержащим persistence.xml META-INF каталог under) в lib каталоге файла ear, единица сохранения myPU должна быть видна всем компонентам в ear. И вот немного измененный макет каталога:

 EAR
   moduleEjb.jar
   moduleWeb.war
   lib
      entity.jar
      resource.jar
          META-INF  // in the root of the jar file
              persistence.xml
  

Связанное чтение: Глава 8: Упаковка объектов спецификации JPA 2.1.