Мэйвен поколения Java исходный код гибернации

Im занят преобразованием существующего проекта из сборки 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. Я бы предпочел не смешивать Ant и Maven. Может ли кто-нибудь предложить способ сделать это так что все .hbm.xml-файлы подобраны, и генерация кода происходит как часть этапа сборки генерации кода Maven?

спасибо!

Адам.

3 ответов


Ну там 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> 

EDIT: плагин на самом деле ищет .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. The 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>

С такой конфигурацией, бег!--15--> создает 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;
    }




}

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


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

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

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

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

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


Если вам нужно включить *.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>