18

生成された Java ソース コードを使用して、

  • Hibernate ツールで生成されたコード
  • JAXB スキーマ バインディング (xjc) で生成されたコード
  • WDSL2Java (cxf) で生成されたコード

生成されたクラスはすべて「値オブジェクト」型であり、ビジネス ロジックはありません。また、生成されたソース コードにメソッドを追加すると、ソース コードの生成を繰り返すと、これらのメソッドが失われます。

これらの Java コード生成ツールは、生成されたコードを「拡張」する方法を提供しますか?

例えば、

  • ToString メソッドをオーバーライドする (ログ用)
  • 訪問者パターンを実装する (データ分析/検証用)
4

7 に答える 7

8

Hibernate に関しては、コード生成で使用されるテンプレート ファイルを微調整して、その動作を変更できます。HIbernate Tools を微調整したい場合は、次のように編集できます: dao/daohome.ftl

.hbm.xmlファイルを編集して、「toString()」出力にフィールドを追加することもできます

...
<property name="note" type="string">
    <meta attribute="use-in-tostring">true</meta>
    <column name="note" />
</property>
...

ロギングと検証の両方で、AspectJ で AOP を使用することを検討できます(生成されたコードをいじることはお勧めしません。何度もゼロからビルドする必要があるからです)。

于 2009-04-23T07:41:02.643 に答える
4

最初に繰り返しますが、生成されたコードの変更には多くの問題があり、可能な場合は避けるべきです。とはいえ、コードが再生成されたときに変更を処理するだけでは、これを回避したり、より多くの労力を費やしたりするのは実際的ではない場合があります。

残念ながら、Java は C# が持つ部分クラスの概念をサポートしていません。これらはまさにこの種の問題を解決するためのものです。

コード生成ツールが、クラスに自分で追加した領域を区切る何らかの形式の意味のあるコメントをサポートしているかどうかを確認する必要があります (これは可能性が低く、コードを追加するのではなく変更する場合には役に立ちません)。

本当にこれを行いたい場合の最善のオプションは、最初にファイルを生成し、すぐにバージョン コントロール リポジトリにチェックインすることです。次に、変更を加えてチェックインします。

次にツールを再実行して、既存のファイルを上書きできるようにすると、ソース管理されたファイルと比較して、変更をマージして元に戻すことができます (新しい列/テーブルの追加などのほとんどの些細な変更はほとんど手間がかかりません.

コード ジェネレーターが根本的に異なるコード (新しいバージョンなど) を突然生成する場合、これはあまり役に立ちませんが、そのような場合、既に公開されているデータ/メソッドに依存する単なる追加の便利なメソッドではなく、追加したコードには問題があります。クラスにどのように混在していても。ただし、バージョン管理システムは元の変更も記録するため、以前に追加したものと、新しいスタイルで再作成する必要があると思われるものを確認できるため、引き続き役立ちます。

于 2009-04-23T07:42:49.377 に答える
3

私が Hibernate を使用した方法は、基本クラスを生成してから拡張することです。すべてのビジネス ロジック (存在する場合) をこれらのサブクラスに追加します。生成されたクラスをさらにカスタマイズするために、Hibernate が使用する FreeMarker テンプレートを変更することもよくあります。

于 2009-04-23T10:06:09.440 に答える
3

ファイル自体を編集するか、サブクラス化することによって、生成されたコード ファイルを編集することはお勧めできません。何をするにしても、ツールによって作成された署名はそのまま残しておいてください。そうすれば、ファイルが自動生成されたものであることを将来理解できるようになります。

ツールのコマンド オプションを調べて、ある程度の柔軟性が得られるかどうかを確認することをお勧めします。一部のツールは、具象クラスの代わりに抽象クラスまたはインターフェースを生成できます。これが不可能な場合は、自動生成されたオブジェクトをメンバー変数として含むドメイン オブジェクトを作成します。

于 2009-04-23T07:34:46.760 に答える
1

AOPの引用は良いものです。非常に優れたAOP機能が組み込まれているSpringを追加します。

于 2009-04-23T09:59:06.693 に答える
1

見て

http://code.google.com/p/jaxb-method-inserter/

私が書いた JAXB 用の小さなプラグインで、使い方はとても簡単です。それが役立つことを願っています

于 2011-01-25T14:10:50.763 に答える