7

既存のプロジェクトを 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>

私はインターネットを見回しましたが、Maven内でAntを使用してこれを行う人もいれば、Mavenプラグインを使用する人もいます。Ant と Maven を混在させることは避けたいと思います。すべての .hbm.xml ファイルが取得され、Maven コード生成ビルド フェーズの一部としてコード生成が行われるようにする方法を誰か提案できますか?

ありがとう!

アダム。

4

3 に答える 3

14

Ant と Maven を混在させたくない場合は、Maven Hibernate3 Pluginがあります (これは、IMO では良い考えです)。hbm2javaデフォルトでgenerate-sourcesフェーズにバインドされている目標があります。詳細については Mojo の Web サイトを参照してください。ただし、プラグインのセットアップは次のようになります。

  <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.xmlinを探してtarget/classes、Java ソース ファイルを生成します。したがって、マッピング ファイルを に配置すると、プラグインによって呼び出されるフェーズ中に にsrc/main/resourcesコピーされ、問題なく機能します。次のサンプル プロジェクトでこれをテストしました。target/classesprocess-resources

maven-hibernate3-testcase
|-- pom.xml
`-- src
    |-- メイン
    | | |-- ジャワ
    | | `-- リソース
    | | |-- Person.hbm.xml
    | | ` -- hibernate.cfg.xml
    `-- テスト
        `--ジャバ

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;
    }




}

すべてが説明どおりに機能します。

于 2009-12-14T11:18:27.813 に答える
0

パスカル、助けてくれてありがとう!あなたのソリューションはうまくいきます。

これに取り組んでいる間に私が遭遇した他のいくつかのこと。1 つ目は、これがかなり大きなプロジェクトであるという事実に関連しているため、元の ant マルチディレクトリ ビルドをミラーリングするために複数の Maven モジュールに分割しました。生成されたクラスを含むモジュールは実際にはデータベース アクセスを行わないため、hibernate.cfg.xml ファイルには DB 接続情報を含める必要はなく、この場合は含めるべきではありません。私はこれを試してみましたが、すべてのプロパティ タグが削除された、Pascal が提供するファイルのカット ダウン バージョンで問題なく動作します。

これにより、ビルドはコマンドラインから正常に機能しました。しかし、できる限り試してみましたが、Eclipse から実行したときに生成されたクラスを取得するように他のモジュールを説得することはできませんでした。当分の間、これに対する解決策は、構成/コンポーネント/コンポーネントの下のPOMに次の行を追加することです:

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

これにより、Eclipse が他のモジュール用にファイルを取得できる場所にファイルが強制的に生成されます。これが完了したら、コマンド ラインでビルドを実行し、ソース ディレクトリの内容を更新して新しいファイルを取得するように Eclipse に要求する必要があります。まだ、これを処理するためのよりクリーンな方法を知りません....

于 2009-12-14T23:20:18.260 に答える