2012-02-29 16 views
6

tengo una configuración de proyecto donde he modularizado un proyecto, y empaqué un módulo en un archivo jar que se incluye en el proyecto principal cuando creamos una guerra y lo desplegamos. El problema al que me enfrento es que tengo una entidad presente en el módulo que no se carga cuando JPA Container EntityManagerFactory para unitName se genera durante el inicio.Cargando la entidad JPA desde el archivo Jar externo

La pregunta básica que tengo es ¿no busca EntityManager en persistence.xml y luego carga las propiedades que se especifican y luego analiza todos los paquetes para la anotación @Entity?

Cualquier información sobre cómo funciona esto y cómo puedo resolver esto sería genial.

Encontré este enlace y menciona la creación de unidades de persistencia separadas, pero aquí no necesito una unidad de persistencia separada. Solo necesito que el módulo se guarde en el proyecto principal y cargue la entidad y cualquier otra clase @Resource, @Component, lo cual hace debido al contexto: exploración de componente y configuración de anotación.

http://javathoughts.capesugarbird.com/2009/02/jpa-and-multiple-persistence-units.html

Aquí está mi código/configuración

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceUnitName" value="LineManagement" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="generateDdl" value="false" /> 
      <property name="showSql" value="false" /> 
      <property name="databasePlatform" ref="cpsHibernateDialectClassName" /> 
     </bean> 
    </property> 
    <property name="beanName" value="entityManager"></property> 
</bean> 

definición del EnitityManagerFactory para que se inicie el gestor de entidades.

<persistence-unit name="LineManagement" transaction-type="RESOURCE_LOCAL"> 
    <properties> 
     <property name="hibernate.id.new_generator_mappings" value="true" /> 
     <property name="hibernate.current_session_context_class" value="thread" /> 
     <property name="hibernate.default_batch_fetch_size" value="200" /> 

....

persistence.xml que define la caché de segundo nivel y otras propiedades de hibernación.

Luego, el módulo que tiene una entidad.

import javax.persistence.Entity; 


@Entity 
@Table(name = IntegrationEvent.TABLE_NAME, uniqueConstraints = @UniqueConstraint(columnNames = "INTGRTN_EVNT_QUEUE_SK")) 
@GenericGenerator(name = "UUID_GEN", strategy = "org.hibernate.id.UUIDHexGenerator",  parameters = { @Parameter(name = "separator", value = "-") }) 
public class IntegrationEvent implements Serializable { 

.... }

Nota: la entidad está en un paquete diferente de la de los padres, ya que es un módulo independiente por sí mismo.

La entidad que carga bien en el proyecto principal.

package com.parent.line.entity; 

import javax.persistence.Entity; 

@Entity 
@Table(name = "ACCOUNT") 
@Cacheable(true) 
public class Account 
    implements LMLookupTypeEntityByDivision, Serializable, Comparable<Account> { 
+1

El problema se debió a que tuve el módulo agregado como una dependencia de mi proyecto principal, ya que está completamente separado. Por lo tanto, se colocaría en mi carpeta WEB-INF/lib. Después de depurar el código JPA donde carga las entidades, me di cuenta de que el classpath donde comienza a buscar las anotaciones @Entity era de WEB-INF/classes. lo cual tiene sentido, ya que lib es de solo lectura. ahora, tengo que pensar en agregar el módulo en la carpeta de clases o usar la etiqueta en persistence.xml de alguna manera para permitir que la entidad jar sea escaneada y cargada – Hrishikesh

Respuesta

4

Para analizar las entidades que residen en el jar, debe incluirlo en persistence.xml. <jar-file>packedEntity.jar</jar-file>.

Si desea cargar la unidad del paquete, puede intentar inyectarla directamente desde el contenedor. @PersistenceContext(unitName = "../packedEntity.jar#main")

no he probado pero se puede activar la detección automática de hibernación para las entidades <property name="hibernate.archive.autodetection" value="class, hbm"/>

1

En el trabajo no utilizamos la APP pero Hibernate, y nuestro proyecto es totalmente modular. Manejamos alrededor de 30 países que no usan los mismos módulos, y podemos cargar todas las entidades de estos módulos en una fábrica de sesiones simplemente cambiando las dependencias maven (no hay archivo orm para modificar)

La solución utilizada es usa el SPI de Java El ServiceLoader buscará las clases que implementan una interfaz central EntityProvider. Cada EntityProvider de cada módulo codificará las entidades que trae y devolverá una lista de entidades al llamar a ServiceLoader.load (EntityProvider.class). Por lo tanto, en el núcleo de la plataforma solo tenemos que crear una fábrica de sesiones basada en resortes en la que proporcionamos la lista de entidades mediante un bean de fábrica que llamará al SPI.

No sé si será fácil con JPA, pero estoy bastante seguro de que es posible, pero es posible que deba crear manualmente los campos electromagnéticos de un contexto de primavera, y también la PersistenceUnit, supongo ... Lo que sea want es una unidad de persistencia que es una "fusión" de las unidades de persistencia de todos sus módulos (al menos para sus entidades) Eche un vistazo a SPI y también al paquete javax.persistence.spi.

Check también cómo crear una FEM con la primavera: AbstractEntityManagerFactoryBean

Edición: se puede comprobar esto: using the MergingPersistenceUnitManager to load entity

0

si está utilizando arranque de primavera utilizar la anotación de exploración entidad en su clase principal springboot

@EntityScan(
     basePackageClasses = {externalpackage.classname.class} 
) 
Cuestiones relacionadas