Come configurare Hibernate-tools con Maven per generare hibernate.cfg.xml, * .hbm.xml, POJO e DAO
-
27-09-2019 - |
Domanda
uno può dirmi come forzare Maven precedere mappatura .hbm.xml file nel file hibernate.cfg.xml generato automaticamente con il percorso del pacchetto?
La mia idea generale è, mi piacerebbe usare Hibernate-tools via Maven per generare lo strato di persistenza per la mia applicazione. Così, ho bisogno del hibernate.cfg.xml, allora tutti my_table_names.hbm.xml e alla fine del POJO del generato. Tuttavia, l'obiettivo hbm2java
non funzionerà come ho messo file * .hbm.xml nella cartella src/main/resources/package/path/
ma hbm2cfgxml
specifica i file di mapping solo dal nome della tabella, cioè:.
<mapping resource="MyTableName.hbm.xml" />
Quindi, la grande domanda è: come posso configurare hbm2cfgxml
in modo che assomiglia hibernate.cfg.xml come di seguito:
<mapping resource="package/path/MyTableName.hbm.xml" />
I miei sguardi pom.xml come questo in questo momento:
<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>
E poi la seconda domanda: esiste un modo per dire Maven per copiare le risorse nella cartella di destinazione prima di eseguire hbm2java
? Al momento sto usando
mvn clean resources:resources generate-sources
per questo, ma ci deve essere un modo migliore.
Grazie per qualsiasi aiuto.
Aggiornamento:
@Pascal: Grazie per il vostro aiuto. Il percorso per le mappature funziona bene ora, non so che cosa era sbagliato prima, però. Forse c'è qualche problema con la scrittura hibernate.cfg.xml durante la lettura di configurazione del database da esso (anche se il file viene aggiornato).
Ho cancellato il file hibernate.cfg.xml, lo ha sostituito con database.properties ed eseguire il hbm2cfgxml
obiettivi e hbm2hbmxml
. Anche io non uso il outputDirectory
né configurationfile
in quegli obiettivi più.
Di conseguenza i file hibernate.cfg.xml
e tutti *.hbm.xml
vengono generati nel mio target / / generate-mapping / cartella Hibernate3, che è il valore di default. Poi ho aggiornato il gol hbm2java
con la seguente:
<componentProperties>
<packagename>package.name</packagename>
<configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile>
</componentProperties>
Ma poi ho la seguente:
[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
Come faccio a trattare con questo? Naturalmente potrei aggiungere:
<outputDirectory>src/main/resources/package/name</outputDirectory>
alla meta hbm2hbmxml
, ma penso che questo non è l'approccio migliore, o è? Esiste un modo per mantenere tutti il codice e le risorse di distanza dalla cartella src/
generato?
presumo, l'obiettivo di questo approccio non è quello di generare tutte le fonti nel mio src / main / java o / risorse di cartelle, ma per mantenere il codice generato nella cartella di destinazione. Mentre io in genere d'accordo con questo punto di vista, mi piacerebbe continuare con quella hbm2dao
alla fine l'esecuzione e il confezionamento del project da usare come componente strato di persistenza generata dal livello di business. E 'questo anche quello che volevi dire?
Soluzione
Come posso configurare hbm2cfgxml in modo che gli sguardi hibernate.cfg.xml come qui di seguito (...)
Ho un progetto che utilizza hbm2cfgxml
e le voci <mapping resource="..."/>
non riflettere l'packagename nel percorso al hbm.xml
. Quindi c'è chiaramente qualcosa che non va al vostro fianco. Qui ci sono alcune osservazioni:
- I legherebbe
hbm2cfgxml
sulla fasegenerate-resources
, non sta generando fonti - Non genera il file in
src/main/resources
ma intarget/classses
(il motivo per cui si fa a mettere generato roba nell'albero dei sorgenti, si desidera unclean
pulirlo). - C'è un errore di battitura, è
configurationfile
, nonconfigurationFile
ma ... - Perché diavolo hai una
<configurationfile>
nella configurazione dihbm2cfgxml
? Si desidera generare qui ... Vorrei rimuoverlo.
Aggiornamento: Si dovrebbe mettere le informazioni necessarie per la connessione al database in src/main/resources/database.properties
(che è il valore di default del propertyfile
proprietà), non in src/main/resources/hibernate.cfg.xml
(rimuovere quel file). Qui di seguito un database.properties
campione:
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
E come ho detto, rimuovere il file src/main/resources/hibernate.cfg.xml
, si desidera generare esso.
c'è un modo per dire Maven per copiare le risorse nella cartella di destinazione prima di eseguire hbm2java? (...)
Il hbm2java
obiettivo Richiama l'esecuzione della fase del ciclo di vita del processo-risorse prima per l'esecuzione stessa (dalla documentazione). Ecco, questo è il comportamento predefinito e si verifica con hibernate3:hbm2java
o generate-sources
se hbm2java
è legato ad esso.
Altri suggerimenti
Ok, ho risolto il mio problema forzando Maven per mettere i file hbm.xml
nel / target / classi / pacchetto / nome cartella, così, alla fine del mio aspetto pom in questo modo:
<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>
E funziona bene. Come fas come ho potuto vedere in altri post, in alcune fasi prima build quei file hbm.xml
devono essere copiati da di destinazione / Hibernate3 / generate-mappature (dove vengono generati per impostazione predefinita) per target / classi / pacchetto / nome (dove ibernazione-tools sguardi per loro), ma nel mio caso non lo sono (che indica che sto facendo qualcosa di sbagliato). Quindi, se c'è qualcuno là fuori sapere che cosa potrebbe essere che sto facendo male, la prego di dirmi. Altrimenti Dovrà bastare.
C'è una cosa che non funziona: i nomi dei pacchetti non vengono utilizzati nelle POJO e DAO generato: ma ho creato un altro thread per questo qui .
Aggiornamento: ok, ora ho finalmente capito. Il problema con i nomi dei pacchetti mancante era nella configurazione del obiettivo hbm2hbmxml
. Ho perso le componentProperties con packagename , in modo che il hbm.xml
generato mancavano i nomi di classe non completamente classificati. Ho aggiornato il pom sopra, ora funziona benissimo. Il problema per quanto riguarda esplicitamente la copia dei file hbm.xml
per di destinazione / classes cartella è ancora il caso, però.
Per un esempio su come utilizzare gli strumenti di Hibernate con Maven, senza l'utilizzo di Hibernate3-Maven-plug di controllo questo post . L'idea è quella di eseguire gli strumenti Hibernate task Ant con Maven. Questo approccio consente il pieno controllo sul processo.