2010-05-16 3 views
14

может кто-нибудь сказать мне, как заставить maven предшествовать сопоставлению файлов .hbm.xml в автоматически сгенерированном спящем режиме .cfg.xml файл с пулом пакетов?Как настроить hibernate-tools с maven для генерации hibernate.cfg.xml, * .hbm.xml, POJO и DAO

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

ответ

8

как я могу настроить hbm2cfgxml так, что hibernate.cfg.xml выглядит, как показано ниже (...)

У меня есть проект, который использует hbm2cfgxml и <mapping resource="..."/> записи сделать отражает имяпакет в путь к hbm.xml. Таким образом, на вашей стороне явно что-то не так. Вот несколько замечаний:

  • Я бы связать hbm2cfgxml на generate-resources фазе, вы не генерируя источники
  • Я бы не генерировать файл в src/main/resources, но в target/classses (почему вы положили генерируемый материал в исходное дерево, вы хотите, чтобы его очистили clean).
  • Существует опечатка, это configurationfile, не configurationFile но ...
  • Какого черта вы имеете в конфигурации hbm2cfgxml в <configurationfile>? Вы хотите создать его здесь ... Я бы удалил его.

Update: Вы должны поместить информацию, необходимую для подключения к базе данных в 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 привязан к нему.

+0

Спасибо за ваши замечания Паскаль. Я переместил выполнение в generate-resources, исправил опечатку. 1. Как настроить пользователя и пароль для спящего режима, если не hibernate.cfg.xml (или hibernate.properties)? Идея здесь в том, что hibernate.cfg.xml читается и обновляется, если были сделаны какие-либо изменения в модели данных. Существует ли более оптимальный подход? Все остальные параметры заставляют меня поддерживать одну и ту же конфигурацию в двух отдельных файлах с различным синтаксисом. Что касается моего второго вопроса, также спасибо за ваш ответ. Основной вопрос относительно путей/to/mapping остается открытым. – mmm

+0

@mmm: Я обновил свой ответ, попробую. –

+0

Спасибо за вашу помощь: он отлично работал. Я обновил свой вопрос. – mmm

2

Ok, я установил мою проблему, заставляя Maven поставить hbm.xml файлы в /цель/классы/пакет/имя папку, так что в конце моего англичанина выглядит следующим образом:

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

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

Обновление: ОК, теперь я, наконец, получил его. Проблема с отсутствующими именами пакетов была в конфигурации цели hbm2hbmxml. Я пропустил componentProperties с packagename там, поэтому сгенерированный hbm.xml пропустил полностью классифицированные имена классов. Я обновил вышеупомянутый pom, теперь он отлично работает. Тем не менее вопрос о явном копировании файлов hbm.xml в папку цели/классов сохраняется.

1

Для примера о том, как использовать инструменты Hibernate с maven, без использования hibernate3-maven-plugin check this post. Идея состоит в том, чтобы запустить Hibernate Tools Ant с Maven. Этот подход дает вам полный контроль над процессом.