Как настроить hibernate-tools с помощью maven для генерации hibernate.cfg.xml, *.hbm.xml, POJO и DAO
может ли кто-нибудь сказать мне, как заставить maven предшествовать сопоставлению файлов .hbm.xml в автоматически сгенерированном файле hibernate.cfg.xml с пулом пакетов?
Моя общая идея: я хотел бы использовать hibernate-tools через maven для создания слоя persistence для моего приложения. Итак, мне нужен hibernate.cfg.xml, затем все my_table_names.hbm.xml и в конце генерируется POJO. Тем не менее, цель hbm2java
не будет работать, поскольку я помещаю файлы *.hbm.xml в папку src/main/resources/package/path/
, но hbm2cfgxml
указывает файлы сопоставления только по имени таблицы, то есть:
<mapping resource="MyTableName.hbm.xml" />
Поэтому возникает большой вопрос: как я могу настроить hbm2cfgxml
так, чтобы hibernate.cfg.xml выглядел следующим образом:
<mapping resource="package/path/MyTableName.hbm.xml" />
Мой pom.xml выглядит следующим образом:
<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>
И затем второй вопрос: есть ли способ сказать maven для копирования ресурсов в целевую папку перед выполнением hbm2java
? На данный момент я использую
mvn clean resources:resources generate-sources
для этого, но должен быть лучший способ.
Спасибо за любую помощь.
Update:
@Pascal: Благодарим за помощь. Теперь путь к сопоставлениям прекрасен, но я не знаю, что было раньше. Возможно, есть проблема с записью hibernate.cfg.xml при чтении конфигурации базы данных (хотя файл обновляется).
Я удалил файл hibernate.cfg.xml, заменил его на database.properties и запустил цели hbm2cfgxml
и hbm2hbmxml
. Я также не использую outputDirectory
и configurationfile
в этих целях больше.
В результате файлы hibernate.cfg.xml
и все *.hbm.xml
генерируются в папку target/hibernate3/сгенерированные-сопоставления/, которая является значением по умолчанию. Затем я обновил цель hbm2java
следующим образом:
<componentProperties>
<packagename>package.name</packagename>
<configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile>
</componentProperties>
Но затем я получаю следующее:
[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
Как мне с этим справиться? Конечно, я мог бы добавить:
<outputDirectory>src/main/resources/package/name</outputDirectory>
к цели hbm2hbmxml
, но я думаю, что это не лучший подход или не так ли? Есть ли способ сохранить все сгенерированный код и ресурсы вдали от папки src/
?
Я предполагаю, что целью этого подхода является не создание каких-либо источников в моей папке src/main/java или /resources, а сохранение сгенерированного кода в целевой папке. Как я обычно согласен с этой точкой зрения, я хотел бы продолжить, что в конечном итоге выполняется hbm2dao
и упаковывает проект, который будет использоваться в качестве сгенерированного компонента уровня сохранения из бизнес-уровня. Это и то, что вы имели в виду?
Ответы
Ответ 1
как настроить hbm2cfgxml так, чтобы hibernate.cfg.xml выглядел ниже (...)
У меня есть проект, который использует hbm2cfgxml
, а записи <mapping resource="..."/>
отражают имя пакета в пути к hbm.xml
. Таким образом, на вашей стороне явно что-то не так. Вот несколько замечаний:
- Я бы привязал
hbm2cfgxml
к фазе generate-resources
, вы не генерируете источники
- Я бы не сгенерировал файл в
src/main/resources
, а в target/classses
(зачем вы добавляете сгенерированный материал в исходное дерево, вы хотите, чтобы clean
очистил его).
- Существует опечатка, она
configurationfile
, а не configurationfile
, но...
- Почему, черт возьми, у вас есть
<configurationfile>
в конфигурации hbm2cfgxml
? Вы хотите сгенерировать его здесь... Я бы удалил его.
Обновление:. Вы должны поместить информацию, необходимую для подключения к базе данных в src/main/resources/database.properties
(что значение по умолчанию propertyfile
), а не в src/main/resources/hibernate.cfg.xml
(удалите этот файл). Ниже образца 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
И как я уже сказал, удалите файл src/main/resources/hibernate.cfg.xml
, который вы хотите сгенерировать.
Есть ли способ сказать maven для копирования ресурсов в целевую папку перед выполнением hbm2java? (...)
Цель hbm2java
Вызывает выполнение фазовых процессов процесса жизненного цикла до выполнения самого себя (из документации). Так что поведение по умолчанию и происходит с помощью hibernate3:hbm2java
или generate-sources
, если hbm2java
привязано к нему.
Ответ 2
Хорошо, я исправил свою проблему, вынудив maven поместить файлы hbm.xml
в папку /target/classes/package/name, поэтому в конце мой pom выглядит следующим образом:
<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>
И он работает нормально. Поскольку, как я мог видеть в других сообщениях, на некоторых ранних этапах сборки эти файлы hbm.xml
должны быть скопированы из target/hibernate3/сгенерированные сопоставления (где они созданы по умолчанию) для target/classes/package/name (где hibernate -tools ищет их), но в моем случае они не (что указывает, что я делаю что-то неправильно). Поэтому, если кто-нибудь знает, что это может быть, я делаю неправильно, скажите мне. Иначе этого будет достаточно.
Есть одна вещь, которая не работает: имена пакетов не используются в сгенерированных POJO и DAO: но я создал для этого еще один поток.
Обновление: ОК, теперь я наконец получил его. Проблема с отсутствующими именами пакетов была в конфигурации цели hbm2hbmxml
. Я пропустил componentProperties с именем packagename, поэтому сгенерированный hbm.xml
пропустил полностью классифицированные имена классов. Я обновил вышеупомянутый pom, теперь он отлично работает. Тем не менее проблема с явным копированием файлов hbm.xml
в папку target/classes сохраняется.
Ответ 3
Для примера о том, как использовать инструменты Hibernate с maven, без использования hibernate3-maven-plugin, отметьте этот пост. Идея состоит в том, чтобы запустить задачу Hibernate Ant с Maven. Этот подход дает вам полный контроль над процессом.