So konfigurieren Sie Hibernate-Tools mit maven hibernate.cfg.xml, * .hbm.xml, POJOs und DAOs zu erzeugen
-
27-09-2019 - |
Frage
kann mir jemand sagen, wie zu zwingen Maven zu precede Mapping .hbm.xml Dateien in der automatisch generierten hibernate.cfg.xml Datei mit Paketpfad?
Meine allgemeine Idee ist, würde Ich mag Hibernate-Tools über Maven verwenden, um die Persistenz-Schicht für meine Anwendung zu erzeugen. Also, ich brauche die hibernate.cfg.xml, dann werden alle my_table_names.hbm.xml und am Ende der POJO des erzeugten. Doch das hbm2java
Ziel wird nicht funktionieren, wie ich * .hbm.xml Dateien in den Ordner src/main/resources/package/path/
setzen aber hbm2cfgxml
legt die Mapping-Dateien nur von Tabellennamen, das heißt:.
<mapping resource="MyTableName.hbm.xml" />
Die große Frage ist: Wie kann ich konfigurieren hbm2cfgxml
so dass hibernate.cfg.xml sieht aus wie folgt:
<mapping resource="package/path/MyTableName.hbm.xml" />
Meine pom.xml wie folgt aussieht im Moment:
<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>
Und dann die zweite Frage: Gibt es eine Möglichkeit, Maven tell Ressourcen in den Zielordner zu kopieren, bevor hbm2java
Ausführung? Im Moment bin ich mit
mvn clean resources:resources generate-sources
für das, aber es muss ein besserer Weg geben.
Vielen Dank für jede Hilfe.
Update:
@Pascal: Vielen Dank für Ihre Hilfe. Der Weg zum Mappings funktioniert gut jetzt, ich weiß nicht, was falsch vorher war, though. Vielleicht gibt es einige Probleme zu hibernate.cfg.xml mit dem Schreiben, während von ihm zu lesen Datenbank config (wenn die Datei aktualisiert wird).
Ich habe die Datei hibernate.cfg.xml gelöscht, ersetzt es mit database.properties und die Ziele hbm2cfgxml
und hbm2hbmxml
laufen. Ich auch nicht mehr die outputDirectory
noch configurationfile
in diesen Zielen verwendet werden.
Als Ergebnis werden die Dateien hibernate.cfg.xml
und alle *.hbm.xml
werden mein Ziel / Hibernate3 / erzeugt-Mappings / Ordner generiert in, die der Standardwert ist. Dann aktualisiert ich das hbm2java
Ziel mit dem folgenden:
<componentProperties>
<packagename>package.name</packagename>
<configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile>
</componentProperties>
Aber dann bekomme ich die folgende:
[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
Wie kann ich damit umgehen? Natürlich könnte ich hinzufügen:
<outputDirectory>src/main/resources/package/name</outputDirectory>
zum hbm2hbmxml
Ziel, aber ich denke, das ist nicht der beste Ansatz, oder ist es? Gibt es eine Möglichkeit zu halten alle der generierte Code und Ressourcen weg vom src/
Ordner?
Ich gehe davon aus, das Ziel dieses Ansatzes ist es keine Quellen in mein src / main / java oder / Ressourcen-Ordner zu erzeugen, aber den generierten Code in den Zielordner zu halten. Wie ich in der Regel mit dieser Sicht zustimmen, würde Ich mag mit, dass schließlich die Ausführung hbm2dao
und Verpacken des Projekts weiterhin als erzeugte Persistenz-Schicht-Komponente aus der Business-Schicht verwendet werden soll. Ist das auch, was Sie gemeint?
Lösung
Wie kann ich configure hbm2cfgxml so dass hibernate.cfg.xml sieht aus wie unter (...)
Ich habe ein Projekt, das hbm2cfgxml
und die <mapping resource="..."/>
Einträge spiegelt das Paket in dem Pfad zum hbm.xml
verwendet. So ist es eindeutig etwas falsch auf Ihrer Seite. Hier sind ein paar Bemerkungen:
- Ich würde
hbm2cfgxml
auf dergenerate-resources
Phase binden, Sie nicht Quellen Erzeugen
- Ich würde nicht die Datei in
src/main/resources
erzeugen, aber intarget/classses
(warum Sie Sachen im Quellbaum erzeugt Stoßen, wollen Sie einclean
um es zu reinigen). - Es ist ein Tippfehler, es ist
configurationfile
, nichtconfigurationFile
aber ... - Warum zum Teufel haben Sie eine
<configurationfile>
in der Konfiguration vonhbm2cfgxml
? Sie wollen es hier generieren ... Ich würde es entfernen.
Update: Sie sollten die Informationen setzen erforderlich ist, um die Datenbank in src/main/resources/database.properties
zu verbinden (das ist der Standardwert der propertyfile
Eigenschaft), nicht in src/main/resources/hibernate.cfg.xml
(entfernen Sie diese Datei). Unterhalb einer Probe 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
Und wie gesagt, entfernen Sie die src/main/resources/hibernate.cfg.xml
Datei, die Sie wollen es erzeugen.
gibt es eine Möglichkeit Maven tell Ressourcen in den Zielordner zu kopieren, bevor hbm2java Ausführung? (...)
Das hbm2java
Ziel Invokes die Ausführung der Lifecycle-Phasen-Prozess-Ressourcen vor sich Ausführen (aus der Dokumentation). So dass das Standardverhalten ist und tritt mit hibernate3:hbm2java
oder generate-sources
, wenn hbm2java
ist an sie gebunden.
Andere Tipps
Ok, Ich reparierte mein Problem maven durch zwingen die hbm.xml
Dateien in den / target / classes / Paket / Namen zu setzen Ordner, so dass am Ende mein pom sieht wie folgt aus:
<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>
Und es funktioniert ok. Als fas wie ich in anderen Beiträgen, in einigen frühen Build Phasen jene hbm.xml
Dateien kopiert werden sollen target / Hibernate3 / erzeugt-Mappings (wo sie werden durch Standard) Ziel sehen konnte / Klassen / Paket / name (wo sie überwintern-Tools aussieht), aber in meinem Fall sind sie nicht (was ich mache etwas falsch angibt). Also, wenn jemand da draußen gibt es zu wissen, was es sein könnte ich falsch mache, bitte sagen Sie mir. Es wird sonst zu genügen hat.
Es ist eine Sache, die nicht funktioniert: die Paketnamen werden nicht in den generierten POJOs und DAOs verwendet: aber ich erstellt einen weiteren Thread für diese hier .
Update: ok, jetzt habe ich es endlich. Das Problem mit dem Paketnamen fehlte, war in der Konfiguration des hbm2hbmxml
Ziel. Ich vermisste die componentProperties mit Paket gibt, so dass die erzeugte hbm.xml
die vollständig klassifizierten Klassennamen verpasst. Ich die oben pom aktualisiert, jetzt ist es funktioniert gut. Die Frage in Bezug auf explizite Kopieren der hbm.xml
Dateien auf die target / classes Ordner ist immer noch der Fall, wenn.
Für ein Beispiel, wie man mit Maven Hibernate Tools zu verwenden, ohne die Verwendung von Hibernate3-maven-Plugin Check diesen Beitrag . Die Idee ist, Hibernate Tools Ant-Task mit Maven laufen. Dieser Ansatz gibt Ihnen die volle Kontrolle über den Prozess.