Как настроить hibernate-tools с помощью maven для генерации hibernate.cfg.xml, * .hbm.xml, POJO и DAO - PullRequest
14 голосов
/ 16 мая 2010

Может ли кто-нибудь сказать мне, как заставить maven предшествовать сопоставлению файлов .hbm.xml в автоматически сгенерированном файле hibernate.cfg.xml с путем к пакету?

Моя общая идея заключается в том, что я хотел бы использовать hibernate-tools через maven для создания слоя персистентности для моего приложения. Итак, мне нужен 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

для этого, но должен быть лучший способ.

Спасибо за любую помощь.

Обновление:

@ Pascal: Спасибо за вашу помощь. Теперь путь к отображению работает нормально, но я не знаю, что было не так раньше. Возможно, существует проблема с записью в hibernate.cfg.xml при чтении конфигурации базы данных из нее (хотя файл обновляется).

Я удалил файл hibernate.cfg.xml, заменил его на database.properties и запустил цели hbm2cfgxml и hbm2hbmxml. Я также больше не использую outputDirectory и configurationfile в этих целях.

В результате файлы hibernate.cfg.xml и все *.hbm.xml создаются в моей папке target / hibernate3 / generate-mappings /, которая является значением по умолчанию. Затем я обновил цель 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 и упаковать проект для использования в качестве сгенерированного компонента персистентного уровня из бизнес-уровня. Это тоже что ты имел ввиду?

Ответы [ 3 ]

8 голосов
/ 16 мая 2010

как я могу настроить 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 голосов
/ 17 мая 2010

Хорошо, я исправил свою проблему, заставив 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 / generate-mappings (где они создаются по умолчанию) в target / classes / package / name (где hibernate-tools их ищет), но в моем случае это не так (что указывает на то, что я делаю что-то не так). Так что если кто-то знает, что это может быть, я делаю неправильно, пожалуйста, скажите мне. В противном случае этого будет достаточно.

Есть одна вещь, которая не работает: имена пакетов не используются в сгенерированных POJO и DAO: но я создал другой поток для этого здесь .

Обновление: Хорошо, теперь я наконец получил его. Проблема с отсутствующими именами пакетов была в конфигурации цели hbm2hbmxml. Я пропустил componentProperties с имя_пакета , поэтому сгенерированный hbm.xml пропустил полностью классифицированные имена классов. Я обновил вышеупомянутый пом, теперь он работает отлично. Однако проблема, связанная с явным копированием файлов hbm.xml в папку target / classes , все еще остается.

1 голос
/ 13 февраля 2016

Например, как использовать инструменты Hibernate с maven, без использования hibernate3-maven-plugin, проверьте этот пост . Идея состоит в том, чтобы запустить задачу Ant инструментов Hibernate вместе с Maven. Такой подход дает вам полный контроль над процессом.

...