with example ejemplo anotaciones annotation hibernate jpa annotations entity

hibernate - example - JPA-mĂșltiples jar que definen objetos @Entity



hibernate-annotations maven (5)

Estamos desarrollando una aplicación web con Spring, Hibernate y Maven de una forma muy modular. Hay proyectos centrales que definen el acceso a los datos y ver cosas específicas, luego hay módulos que definen la lógica y las entidades ( @Entity ) y luego está la aplicación web que define el controlador y la vista.

Ahora tenemos un módulo de seguridad que define las entidades de seguridad, como la cuenta y el rol, y tenemos un módulo prototipo que define algunas entidades de ejemplo, como cliente y pedido. Ambos tienen una PersistenceUnit definida dentro de un persistence.xml que está prácticamente vacío excepto por el nombre de PersistenceUnit, ya que toda la configuración de la base de datos se realiza en la aplicación web con un datasource.xml. Se supone que la aplicación web carga ambas jarras como dependencias maven.

Ambos proyectos construirán bien, autocifrarán todas las entidades y las crearán para sus respectivas pruebas unitarias. También se cargarán correctamente dentro de la aplicación web si se agregan individualmente.

Sin embargo, tan pronto como ambos se carguen al mismo tiempo, el segundo anulará la PersistenceUnit del primero y así creará una IllegalArgumentException : Not an entity para todas las entidades desde la primera. Si ambos proyectos tienen una unidad de persistencia diferente, la carga de la aplicación web arrojará otra excepción diciendo que no single default persistence unit definió no single default persistence unit .

Entonces ... ¿cómo puedo hacer que todas las clases con anotaciones de @Entity carguen en mi aplicación web sin tener que definirlas todas en el @Entity persistence.xml (como here ) sino en el escaneo de componentes? This parece una idea, aunque no sé cómo usarla y probarla ...

Creo que debemos fusionar todas las PersistenceUnits dentro de la aplicación web o cargar todas las Entidades programáticamente. Definirlos con código fijo dentro de persistence.xml no es una opción para nosotros.


Bueno, estamos teniendo un problema similar en nuestro ciclo de desarrollo. Si sus entidades de referencia están en otro archivo -ejb.jar (ese es nuestro caso) puede vincular estas entidades con

<jar-file>relativePathToYourJar/dependent-entities-ejb.jar</jar-file>

etiqueta. Tenga en cuenta que también debe incluir un persistence.xml en la carpeta META-INF de dependent-entities-ejb.jar . Más información puede ser encontrada here .


Dado que la pregunta parece llamar la atención, publicaré nuestra última solución al problema.

Ahora estamos escaneando automáticamente todos los paquetes en lugar de usar archivos persistence.xml en cualquier lugar.

En nuestro datasource.xml agregamos la línea

<property name="packagesToScan" value="our.basepackage" />

Casi completo datasource.xml:

<!-- Bean definition here --> <bean id="ourDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <!-- define connection properties --> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="ourDataSource" /> <property name="packagesToScan" value="our.basepackage" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="false" /> <property name="generateDdl" value="true" /> <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> </bean> </property> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />




Usamos un diseño de módulo similar, pero colocamos el contexto de persistencia en la parte war de nuestra aplicación e inyectamos el entitymanager en los DAO de los módulos. A excepción de las pruebas unitarias, los módulos no tienen PU. Hicimos esto porque teníamos miedo de que una transacción que abarcara múltiples módulos pudiera causar problemas.

En la DAO

@PersistenceContext private EntityManager em;

En persistance.xml, necesita alistar todas las entidades con los elementos.

<persistence-unit name="myPU"> <class>com.Entity1</class> <class>com.Entity2</class>

etc.