2010-05-16 41 views
14

¿alguien puede decirme cómo forzar maven a preceder a la asignación de archivos .hbm.xml en el hibernate generado automáticamente archivo .cfg.xml con la ruta del paquete?Cómo configurar hibernate-tools con maven para generar hibernate.cfg.xml, * .hbm.xml, POJOs y DAOs

Mi idea general es, me gustaría usar hibernate-tools a través de maven para generar la capa de persistencia para mi aplicación. Entonces, necesito el hibernate.cfg.xml, luego todos mis_nombre_tabla.hbm.xml y al final los POJO generados. Sin embargo, el objetivo hbm2java no funcionará como puse los archivos * .hbm.xml en la carpeta src/main/resources/package/path/ pero hbm2cfgxml especifica los archivos de asignación única por nombre de la tabla, es decir:

<mapping resource="MyTableName.hbm.xml" /> 

Entonces la gran pregunta es: ¿cómo puede configuro hbm2cfgxml modo que hibernate.cfg.xml se parece a continuación:

<mapping resource="package/path/MyTableName.hbm.xml" /> 

Mi pom.xml tiene este aspecto en la actualidad

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>hibernate3-maven-plugin</artifactId> 
    <version>2.2</version> 
    <executions> 
     <execution> 
      <id>hbm2cfgxml</id> 
      <phase>generate-sources</phase> 
      <goals> 
       <goal>hbm2cfgxml</goal> 
      </goals> 
      <inherited>false</inherited> 
      <configuration> 
       <components> 
        <component> 
         <name>hbm2cfgxml</name> 
         <implemetation>jdbcconfiguration</implementation> 
         <outputDirectory>src/main/resources/</outputDirectory> 
        </component> 
       </components> 
       <componentProperties> 
        <packagename>package.path</packageName> 
        <configurationFile>src/main/resources/hibernate.cfg.xml</configurationFile> 
       </componentProperties> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Y luego la segunda pregunta: ¿hay alguna manera de decirle a maven que copie los recursos a la carpeta de destino antes de ejecutar hbm2java? En este momento estoy usando

mvn clean resources:resources generate-sources 

para eso, pero debe haber una manera mejor.

Gracias por cualquier ayuda.

Actualización:

@Pascal: Gracias por su ayuda. El camino a las asignaciones funciona bien ahora, sin embargo, no sé lo que estaba mal antes. Tal vez haya algún problema con la escritura en hibernate.cfg.xml mientras lee la configuración de la base de datos desde allí (aunque el archivo se actualiza).

He eliminado el archivo hibernate.cfg.xml, lo he sustituido por database.properties y ejecuto los objetivos hbm2cfgxml y hbm2hbmxml. Tampoco utilizo el outputDirectory ni el configurationfile en esos objetivos.

Como resultado, los archivos hibernate.cfg.xml y todos *.hbm.xml se están generando en mi carpeta target/hibernate3/generated-mappings /, que es el valor predeterminado. A continuación, he actualizado el objetivo hbm2java con lo siguiente:

<componentProperties> 
    <packagename>package.name</packagename> 
    <configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile> 
</componentProperties> 

Pero entonces me sale el siguiente:

[INFO] --- hibernate3-maven-plugin:2.2:hbm2java (hbm2java) @ project.persistence --- 
[INFO] using configuration task. 
[INFO] Configuration XML file loaded: file:/C:/Documents%20and%20Settings/mmm/workspace/project.persistence/target/hibernate3/generated-mappings/hibernate.cfg.xml 
12:15:17,484 INFO org.hibernate.cfg.Configuration - configuring from url: file:/C:/Documents%20and%20Settings/mmm/workspace/project.persistence/target/hibernate3/generated-mappings/hibernate.cfg.xml 
12:15:19,046 INFO org.hibernate.cfg.Configuration - Reading mappings from resource : package.name/Messages.hbm.xml 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2java (hbm2java) on project project.persistence: Execution hbm2java of goal org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2java failed: resource: package/name/Messages.hbm.xml not found 

¿Cómo puedo lidiar con eso? Por supuesto que podría añadir:

<outputDirectory>src/main/resources/package/name</outputDirectory> 

a la meta hbm2hbmxml, pero creo que esto no es el mejor enfoque, o es? ¿Hay alguna manera de mantener todos el código generado y los recursos fuera de la carpeta src/?

Supongo que el objetivo de este enfoque no es generar fuentes en mi carpeta src/main/java o/resources, sino mantener el código generado en la carpeta de destino.Como generalmente estoy de acuerdo con este punto de vista, me gustaría continuar con eso, finalmente ejecutando hbm2dao y empaquetando el proyecto para ser utilizado como un componente de capa de persistencia generado desde la capa de negocios. ¿Es esto también lo que querías decir?

Respuesta

8

¿Cómo se configura de manera que hbm2cfgxml hibernate.cfg.xml se parece a continuación (...)

Tengo un proyecto que está utilizando hbm2cfgxml y las entradas <mapping resource="..."/> hacer reflejar la nombrepaquete en el ruta al hbm.xml. Entonces claramente hay algo mal de tu parte. Aquí hay algunas observaciones:

  • me uniría hbm2cfgxml en la fase generate-resources, usted no está generando fuentes
  • no generaría el archivo en src/main/resources pero en target/classses (¿por qué poner cosas generado en el árbol fuente, quiere un clean para limpiarlo).
  • hay un error tipográfico, se configurationfile, no configurationFile pero ...
  • ¿Por qué demonios ¿Tiene una <configurationfile> en la configuración de hbm2cfgxml? Quieres generarlo aquí ... Lo eliminaría.

Actualización: Usted debe poner las informaciones requeridas para conectarse a la base de datos en src/main/resources/database.properties (que es el valor predeterminado de la propiedad propertyfile), no en src/main/resources/hibernate.cfg.xml (quitar ese archivo). A continuación una muestra database.properties:

hibernate.connection.driver_class=org.apache.derby.jdbc.ClientDriver 
hibernate.connection.url=jdbc:derby://localhost:1527//home/pascal/Projects/derbyDBs/EMPLDB 
hibernate.connection.username=APP 
hibernate.connection.password=APP 
hibernate.dialect=org.hibernate.dialect.DerbyDialect 

Y como dije, quitar el archivo src/main/resources/hibernate.cfg.xml, desea generarlo.

¿Hay alguna manera de decirle a maven que copie recursos en la carpeta de destino antes de ejecutar hbm2java? (...)

El objetivo hbm2javainvoca la ejecución de los procesos de recursos de fase del ciclo de vida antes de la ejecución en sí (a partir de la documentación). Así que ese es el comportamiento predeterminado y ocurre con hibernate3:hbm2java o generate-sourcessihbm2java está obligado a ello.

+0

Gracias por sus comentarios Pascal. Moví la ejecución a generar recursos, corrigí el error tipográfico. 1. ¿Cómo debo configurar el usuario y la contraseña para hibernate-tools si no lo hace hibernate.cfg.xml (o hibernate.properties)? La idea aquí es que hibernate.cfg.xml se está leyendo y actualizando si se han realizado cambios en el modelo de datos. ¿Hay algún enfoque más óptimo? Todas las demás opciones me obligan a mantener la misma configuración en 2 archivos separados con una sintaxis diferente. En relación con mi segunda pregunta, también gracias por su respuesta. La pregunta principal con respecto a la ruta/a/mapeos sigue abierta. – mmm

+0

@mmm: He actualizado mi respuesta, pruébelo. –

+0

Gracias por su ayuda: funcionó bien. Actualicé mi pregunta – mmm

2

Ok, me fijo mi problema forzando experta en poner los archivos hbm.xml en el /target/classes/paquete/nombre carpeta, por lo que al final mi pom se ve así:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>hibernate3-maven-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
       <execution> 
        <id>hbm2cfgxml</id> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>hbm2cfgxml</goal> 
        </goals> 
        <inherited>false</inherited> 
        <configuration> 
         <components> 
          <component> 
           <name>hbm2cfgxml</name> 
           <implementation>jdbcconfiguration</implementation> 
          </component> 
         </components> 
         <componentProperties> 
          <packagename>package.name</packagename> 
         </componentProperties> 
        </configuration> 
       </execution> 
       <execution> 
        <id>hbm2hbmxml</id> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>hbm2hbmxml</goal> 
        </goals> 
        <inherited>false</inherited> 
        <configuration> 
         <components> 
          <component> 
           <name>hbm2hbmxml</name> 
           <outputDirectory>target/classes</outputDirectory> 
          </component> 
         </components> 
         <componentProperties> 
          <packagename>package.name</packagename> 
         </componentProperties> 
        </configuration> 
       </execution> 
       <execution> 
        <id>hbm2java</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>hbm2java</goal> 
        </goals> 
        <inherited>false</inherited> 
        <configuration> 
         <components> 
          <component> 
           <name>hbm2java</name> 
           <implementation>configuration</implementation> 
          </component> 
         </components> 
         <componentProperties> 
          <packagename>package.name</packagename> 
          <configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile> 
         </componentProperties> 
        </configuration> 
       </execution> 
       <execution> 
        <id>hbm2dao</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>hbm2dao</goal> 
        </goals> 
        <inherited>false</inherited> 
        <configuration> 
         <components> 
          <component> 
           <name>hbm2dao</name> 
           <implementation>configuration</implementation> 
          </component> 
         </components> 
         <componentProperties> 
          <packagename>package.name</packagename> 
          <configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile> 
         </componentProperties> 
        </configuration> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>postgresql</groupId> 
        <artifactId>postgresql</artifactId> 
        <version>8.4-701.jdbc3</version> 
       </dependency> 
      </dependencies> 
     </plugin> 
    </plugins> 
</build> 

Y funciona bien Como fas, como pude ver en otras publicaciones, en algunas de las primeras fases de compilación esos archivos hbm.xml deben copiarse de target/hibernate3/generated-mappings (donde se generan por defecto) a target/classes/package/name (donde hibernate-tools los busca), pero en mi caso no lo están (lo que indica que estoy haciendo algo mal). Entonces, si hay alguien por ahí sabiendo lo que podría ser, estoy haciendo algo malo, por favor díganme. De lo contrario, tendrá que ser suficiente.

Hay una cosa que no funciona: los nombres de paquete no se usan en los POJO y DAO generados: pero creé otro hilo para este here.

Actualización: bien, ahora finalmente lo tengo. El problema con los nombres de paquetes faltantes estaba en la configuración del objetivo hbm2hbmxml. Perdí las componentProperties con nombre del paquete allí, por lo que hbm.xml generado omitió los nombres de clase completamente clasificados. Actualicé el pom anterior, ahora funciona bien. El problema con la copia explícita de los archivos hbm.xml en la carpeta de destino/clases sigue siendo el caso.

1

Para obtener un ejemplo sobre cómo usar las herramientas de Hibernate con maven, sin usar hibernate3-maven-plugin check this post. La idea es ejecutar la tarea Ant de herramientas de Hibernate con Maven. Este enfoque le da el control total sobre el proceso.

Cuestiones relacionadas