Estamos desarrollando una aplicación web con Spring, Hibernate y Maven en un diseño modular de la moda. No son los principales proyectos de definición de datos el acceso y la vista específico de las cosas, entonces hay módulos de la definición de la lógica y de las entidades (@Entity) y luego está el de la aplicación web de la definición de vista y controlador.

Ahora tenemos un módulo de seguridad de la definición de las entidades de seguridad como de la cuenta y el papel y tenemos un prototipo de módulo de definición de algunos ejemplos de entidades como cliente y pedido. Ambos tienen un PersistenceUnit definido dentro de un persistence.xml que es prácticamente vacío a excepción de la PersistenceUnit nombre, como todos los de la base de datos de configuración se realiza en la aplicación web con una datasource.xml. La aplicación web se supone que la carga de ambos frascos como dependencias maven.

Ambos proyectos se construyen bien, autocscanning todas las entidades y la creación de ellos para sus respectivas pruebas de unidad. Se llega cargado dentro de la web de la aplicación con éxito si se añade de forma individual.

Sin embargo, tan pronto como se carga en el mismo tiempo, la segunda se anula la PersistenceUnit de la primera y así crear un IllegalArgumentException : Not an entity para todas las entidades de la primera. Si ambos proyectos tienen un diferente unidad de persistencia, la carga de la web de la aplicación va a lanzar otra excepción diciendo que no single default persistence unit definido.

Así que.. ¿cómo puedo obtener todo @Entity anotado clases a cargar en mi web app sin tener que definir todos ellos dentro de la persistence.xml (como aquí), sino más bien a través de la componente de exploración?
Este parece una idea, aunque no sé cómo utilizar y probarlo…

Creo que tiene que combinar todos los PersistenceUnits dentro de la web de la aplicación o carga de todas las Entidades mediante programación. La definición de ellos codificados dentro de la persistence.xml no es una opción para nosotros.

  • respecto de la primera respuesta: que yo sepa, la Primavera ya se buscará la annotaded clases y los agrega a la PersistenceUnit. El problema es, que tengo a nombre de todos los PersistenceUnits el mismo que se traducirá en ellos primordial de cada uno de los otros. Así que estoy buscando una manera de combinar todos los PersistenceUnits en uno en mi web app. No sé si [este][1] (abajo) iba a hacer, aunque no tengo ni idea de donde registrar un MergingPersistenceUnitPostProcessor [1]: forum.springsource.org/…
InformationsquelleAutor Pete | 2011-09-16

5 Comentarios

  1. 4

    Utilizamos una similar módulo de diseño,
    pero ponemos el contexto de persistencia en la guerra-parte de nuestra aplicación, e inyectar el entitymanager en los DAOs de los módulos.
    Excepto para pruebas de unidad,
    los módulos no tienen un PU.
    Esto lo hicimos porque teníamos miedo,
    que una transacción que abarca varios módulos podrían causar problemas.

    En el DAO

    @PersistenceContext
    private EntityManager em;

    En el persistance.xml usted necesario contar con todas las entidades con los elementos.

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

    etc.

    • Yo a ver.. he intentado que el enfoque y haga el trabajo. Pero ¿no se siente bastante engorroso tener siempre a la actualización que persistence.xml archivo (además de la prueba de la unidad persistence.xml los archivos)? No hay manera dinámica para cargar todo automáticamente?
    • Teóricamente existe un tiempo de ejecución de auto-función de exploración (depende de JPA proveedor? No estoy seguro), pero me pareció que no siempre funcionaba. En mi empresa, me escribió un plugin de Maven, que se ejecutan en la guerra de proyectos de construcción, cuando, para generar de forma automática persistence.xml la base de todas las clases anotado @Entidad en el classpath.
    • Buena idea, que al menos es algo automatizado y sería capaz de suministrar a la última persistence.xml antes de la ejecución de la prueba unitaria. Puedes publicar algunos puntero a los elementos clave de su plugin? No he hecho esto antes… (ya puedo pensar en un segundo caso de uso para este, es decir, la creación de tipos de consulta para queryDSL, ya que el último plugin parece ser roto)
    • Me pregunto si el que la implementación de referencia y las normas han sido actualizadas, de modo que no tenemos que mostrar explícitamente las entidades.
    • ellos son, JPA y en realidad siempre ha sido así. Si no funciona, sólo significa que no siga las reglas (envases, …).
  2. 4

    Ya que la pregunta parece llamar la atención, voy a publicar nuestra última solución para el problema.

    Ahora estamos auto-escaneo de todos los paquetes en lugar de utilizar persistence.xml archivos en cualquier lugar.

    En nuestro datasource.xml hemos añadido a la línea de

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

    Casi completa 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" />

    • Pero esto no ayuda a menos que usted inicie su aplicación. Usted no será capaz de generar estática metamodelo mediante esta config.
  3. 3

    Bien, vamos a tener un problema similar en nuestro ciclo de desarrollo. Si su referencia a entidades que están en el otro-ejb.jar archivo (que es nuestro caso) se puede obligar a estas entidades con

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

    etiqueta. Observe que también se debe incluir un persistence.xml bajo dependent-entities-ejb.jar‘s META-INF carpeta. Más información se puede encontrar aquí.

Dejar respuesta

Please enter your comment!
Please enter your name here