Генерация исходного кода Java Maven для Hibernate - PullRequest
7 голосов
/ 14 декабря 2009

Я занят преобразованием существующего проекта из сборки Ant в проект с использованием Maven. Часть этой сборки включает использование инструмента hibernate hbm2java для преобразования коллекции файлов .hbm.xml в Java. Вот фрагмент скрипта Ant, который используется для этого:

<target name="dbcodegen" depends="cleangen" 
        description="Generate Java source from Hibernate XML">
  <hibernatetool destdir="${src.generated}">
    <configuration>   
      <fileset dir="${src.config}">
        <include name="**/*.hbm.xml"/>
      </fileset>
    </configuration>   
    <hbm2java jdk5="true"/>
  </hibernatetool>   
</target>

Я просматривал Интернет, и некоторые люди, кажется, делают это (я думаю), используя Ant в Maven, а другие - с плагином Maven. Я бы предпочел не смешивать муравья и мавена. Кто-нибудь может предложить способ сделать это так, чтобы все файлы .hbm.xml были подобраны и генерация кода была частью фазы сборки генерации кода Maven?

Спасибо!

Адам.

Ответы [ 3 ]

14 голосов
/ 14 декабря 2009

Ну, есть плагин Maven Hibernate3 , если вы не хотите смешивать Ant и Maven (это хорошая идея, IMO). Он имеет цель hbm2java, которая по умолчанию связана с фазой generate-sources. Обратитесь к веб-сайту Mojo для получения более подробной информации, но настройка плагина может выглядеть примерно так:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>hibernate3-maven-plugin</artifactId>
    <version>2.2</version>
    <executions>
      <execution>
        <phase>generate-sources</phase>
        <goals>
          <goal>hbm2java</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <components>
        <component>
          <name>hbm2java</name>
          <implementation>configuration</implementation>
          <outputDirectory>target/generated-sources/hibernate3</outputDirectory>
        </component>
      </components>
      <componentProperties>
        <drop>true</drop>
        <jdk5>true</jdk5>
        <configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile>
      </componentProperties>
    </configuration>
  </plugin> 

РЕДАКТИРОВАТЬ: Плагин на самом деле ищет .hbm.xml в target/classes для создания исходных файлов Java. Итак, если вы поместите свои файлы сопоставления в src/main/resources, они будут скопированы в target/classes во время фазы process-resources, которая вызывается плагином, и все будет работать. Я только что проверил это с помощью следующего примера проекта:

maven-hibernate3-testcase
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   `-- resources
    |       |-- Person.hbm.xml
    |       `-- hibernate.cfg.xml
    `-- test
        `-- java

pom.xml почти пуст, он просто содержит конфигурацию плагина, показанную выше, и зависимость от junit. hibernate.cfg.xml содержит:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
    <property name="connection.url">jdbc:derby://localhost:1527/mydatabase</property>
    <property name="connection.username">app</property>
    <property name="connection.password">app</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.DerbyDialect</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">false</property>

    <!-- Mapping files -->
    <mapping resource="Person.hbm.xml" />
  </session-factory>
</hibernate-configuration>

А Person.hbm.xml выглядит следующим образом:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping
   PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

  <class name="Person" table="person">
    <id name="id" type="int">
      <generator class="increment" />
    </id>

    <property name="name" column="cname" type="string" />
  </class>

</hibernate-mapping>

В этой конфигурации при запуске mvn install генерируется Person.java, как показано ниже:

$ cat target/generated-sources/hibernate3/Person.java 
// default package
// Generated Dec 14, 2009 2:19:22 PM by Hibernate Tools 3.2.2.GA



/**
 * Person generated by hbm2java
 */
public class Person  implements java.io.Serializable {


     private int id;
     private String name;

    public Person() {
    }

    public Person(String name) {
       this.name = name;
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }




}

Все работает как описано.

0 голосов
/ 19 апреля 2012

Если вам нужно включить * .hbm.xml в фазу компиляции; отредактируйте ваш pom.xml и добавьте следующий код:

<build>
                <resources>
            <resource>
                <directory>source/com/qfund/orm/</directory>
                <targetPath>com/qfund/orm/</targetPath>
                <includes>
                    <include>*.hbm.xml</include>
                </includes>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/java/</directory>
                <includes>
                    <include>*.xml</include>
                    <include>*.xsd</include>
                    <include>*.xslt</include>
                    <include>*.properties</include>
                </includes>
            </testResource>
        </testResources>
</build>
0 голосов
/ 15 декабря 2009

Паскаль, еще раз спасибо за вашу помощь! Ваше решение работает хорошо.

Пара других вещей, с которыми я столкнулся, работая над этим. Первый связан с тем, что это довольно большой проект, и поэтому я разделил его на несколько модулей Maven, чтобы отразить оригинальную сборку ant из нескольких каталогов. Модуль, который содержит сгенерированные классы, на самом деле не имеет никакого доступа к базе данных, поэтому файл hibernate.cfg.xml не должен, и в этом случае не должен содержать какую-либо информацию о соединении с БД. Я попробовал это, и он прекрасно работает с урезанной версией файла, предоставленной Pascal, со всеми удаленными тегами свойств.

При этом сборка работала нормально из командной строки. Однако, как я ни старался, я не смог убедить другие модули забрать сгенерированные классы при запуске из Eclipse. В настоящее время решение, которое у меня есть, состоит в том, чтобы добавить следующую строку в POM в разделе конфигурации / компоненты / компонента:

<outputDirectory>/src/main/java</outputDirectory>

Это вынуждает файлы генерироваться в месте, где Eclipse может подобрать их для других модулей. Как только это будет сделано, вы должны выполнить сборку в командной строке и затем запросить, чтобы Eclipse обновил содержимое исходного каталога, чтобы получить новые файлы. Пока я не знаю более чистого способа справиться с этим ....

...