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