2011-05-29 19 views
11

He utilizado con éxito javax.persistence.NamedQuery en combinación con JPA2. Las consultas nombradas se definen en la parte superior de los archivos de clase de entidad y se utilizan desde EJB sin estado (fachada de entidad).NamedQuery: IllegalArgumentException (consulta no encontrada) después de externalizar entidades

Ahora tuve que extraer los archivos de clase de entidad en un archivo Jar por separado (para que podamos usarlos desde un proyecto de Google Web Toolkit). Obviamente todavía incude el frasco, pero ahora el grano de la fachada no encuentra la pregunta más:

java.lang.IllegalArgumentException: NamedQuery of name: Store.findByExternalId not found. 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getDatabaseQueryInternal(EJBQueryImpl.java:576) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1004) 
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createNamedQuery(EntityManagerWrapper.java:533) 
    at com.skalio.bonusapp.server.StoreFacade.getByExternalId(StoreFacade.java:43) 
    ... 

¿Cuál es el problema aquí? ¿No puedo definir NamedQueries en un Jar externo?

Acabo de encontrar este link, sugiriendo poner los NamedQueries en archivos XML, no como anotaciones en los archivos de entidad. Esto podría ser una idea para resolver mi problema, pero no responde a mi pregunta ...;)

Respuesta

20

La solución es especificar las clases que contienen entidades JPA en el archivo persistence.xml:

<persistence version="2.0" 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"> 
    <persistence-unit name="bonusAppServerPU" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/someDB</jta-data-source> 
     <class>com.skalio.bonusapp.core.Store</class> 
    </persistence-unit> 
</persistence> 

El trasfondo es que a JPA se le debe indicar dónde buscar anotaciones. La otra opción es usar el nodo <jar-file></jar-file>.

+0

Puede utilizar el paquete completo de exploración en lugar de dar el nombre de cada clase, como a continuación '' – Jess