間違いなく、データベースの構造を理解する観点とコードのクリーンさの観点の両方で、問題を解決する最良の方法は、クラスとマッピングを手動で記述することです。
しかし、データベーススキームが適切な規模である場合、このプロセスを自動化したい...または、少なくとも手動で調整できるPOJOクラスとXMLファイルのスケルトンを作成します。
プロセスを(だけでなく)自動化するために、 Antの Javaアプリケーションビルドツールの機能を使用して、既存のデータベースのスキーマをHibernateエンティティファイルに反転するタスクを記述することができるHibernate Toolsパッケージがあります。
EclipseとNetBeansの一般的な開発環境には 、 Hibernate Toolsの構成プロセスを簡素化するウィザードがありますが 、それらは使用しません( NetBeansを使用しますNetBeansとそれほど変わらないことを確認してください...)。 そのため、Antスクリプトを介したハードコア生成パスを選択します。
私たちのタスクは、既存のデータベースのテーブルから特定のHibernateエンティティのセットのPOJOクラスのスケルトンとXMLマッピングを生成することです。
この記事は検討中の技術の詳細には触れておらず、実際には特定の問題を解決するためのレシピであるとすぐに言わなければなりません。
構成の柔軟性を示すために、Hibernateクラスの命名に関する標準的な戦略をデータベーステーブルの名前から独自の名前に変更します。 標準のリバース戦略を放棄する理由は、多くの場合、データベース内のテーブルの名前が、テーブルによって実装されるエンティティの名前の複数の単語として表されるためです。 この場合、標準の命名戦略を使用すると、クラスには情報のない名前が付けられます。
例:
CUSTOMER, CUSTOMERS;
- ACCOUNT, ACCOUNTS;
- USER_TYPE, USER_TYPES...
このようなスキームのデフォルトの命名戦略の逆は、次のクラスになります。
CUSTOMERS -> class Customers;
ACCOUNTS -> class Accounts;
USER_TYPES -> class UserTypes...
その結果、Javaコードのエンティティデータオブジェクトを使用した操作を理解するのは容易ではありません。Customersクラスメソッドが返すものを推測するのは難しいことを認めなければなりません
getAccountses ( )を 設定し ます。
また、一般に、複数の名前を持つクラスの単一オブジェクトを操作することはあまり便利ではありません。
この問題を解決するには、新しいクラスを作成し、既存の戦略のメソッドを再定義することにより、命名戦略を使用できます。
ソースを検討してください。
import org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy ;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy ;
import org.hibernate.cfg.reveng.TableIdentifier ;
パブリック クラス MyNamingStrategy は DelegatingReverseEngineeringStrategyを拡張します {
/ *
* @paramデリゲート{@link org.hibernate.cfg.reveng.ReverseEngineeringStrategy}
* /
public MyNamingStrategy ( ReverseEngineeringStrategyデリゲート) {
スーパー (デリゲート) ;
}
@ オーバーライド
public String tableToClassName ( TableIdentifier tableIdentifier ) {
文字列 tableName = super tableToClassName ( tableIdentifier ) ;
if ( tableName。endsWith ( "ses" ) ) {
tableName = tableName。 部分文字列 ( 0 、tableName.length ( ) - 2 ) ;
} else if ( tableName。endsWith ( "s" ) ) {
tableName = tableName。 substring ( 0 、tableName。length ( ) - 1 ) ;
}
return tableName ;
}
}
ここでは、 tableToClassName( )メソッドを再定義します。このメソッドの本体では、最初に特定のテーブルの標準クラス名を取得してから、複数形のサフィックスを切り取ります。 この戦略を逆のプロセスに適用すると、Hibernateエンティティのクラスとメソッドの名前は、スキーマエンティティの意味をより明確に反映します。
Hibernateエンティティファイルの生成の最後の部分に進みましょう。
次の一連のアクションを実行します。
1.上記のクラスをJavaライブラリとしてコンパイルします。
2.リバースエンジニアリング用に選択されたエンティティを示すreveng.xmlファイルについて説明します。
<?xml version = "1.0" encoding = "UTF-8" ?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-// Hibernate / Hibernate Reverse Engineering DTD 3.0 // EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
<hibernate-reverse-engineering >
<schema-selection match-schema = "DBSCHEMA" />
<table-filter match-name = "CUSTOMERS" />
<table-filter match-name = "USERS" />
<table-filter match-name = "USER_TYPES" />
<table-filter match-name = "ACCOUNTS" />
</ hibernate-reverse-engineering >
3.次に、build.xml-次のテンプレートに基づいてファイルを生成するためのAntスクリプトを作成します。
<?xml version = "1.0" encoding = "UTF-8" ?>
<プロジェクト 名 = "reverse" default = "all" basedir = "。" >
<path id = "project.classpath" >
<!-HibernateおよびHibernate Toolsライブラリへのパス->
<fileset dir = "../lib" >
<include name = "** / *。jar" />
</ファイルセット>
<!-命名戦略を使用したライブラリへのパス->
<fileset dir = "../dist" >
<include name = "** / *。jar" />
</ファイルセット>
</パス>
<taskdef name = "hibernatetool"
classname = "org.hibernate.tool.ant.HibernateToolTask"
classpathref = "project.classpath" />
<ターゲット 名 = "all" >
<hibernatetool >
<jdbcconfiguration
configurationfile = "hibernate.cfg.xml"
packagename = "hibernate.entities"
revengfile = "reveng.xml"
reversestrategy = "MyNamingStrategy" />
<hbm2hbmxml destdir = "。" />
<hbm2java destdir = "。" />
</ hibernatetool >
</ターゲット>
</プロジェクト>
ここでのpathタグは、生成で使用されるクラス(Hibernate、Hibernate Tools、MyNamingStrategy)へのパスを定義します。 タグhbm2hbmxmlおよびhbm2javaは、それぞれツールにXMLマッピングおよびPOJOクラスの作成について伝えます。 生成されたファイルのパスは、対応するタグのdestdir引数を使用して制御できます。
hbm2javaタグには、2つの重要ですがオプションの属性があります。
- jdk5 = "true | false" -JDK5機能を使用したクラスコードの生成
- ejb3 = "true | false" -クラスコードでのEJB3アノテーションの生成
- 構成ファイル-hibernate.cfg.xml構成ファイル
- packagename-将来のPOJOクラスのパッケージ名
- revengfile-最後の段落のrevenge.xml
- reversestrategy-命名戦略を使用したクラスの名前(パスタグにクラスパスを追加することを忘れないでください)
...>ant
Buildfile: build.xml
all:
[hibernatetool] Executing Hibernate Tool with a JDBC Configuration (for reverse engineering)
[hibernatetool] 1. task: hbm2hbmxml (Generates a set of hbm.xml files)
[hibernatetool] 2. task: hbm2java (Generates a set of .java files)
BUILD SUCCESSFUL
Total time: 9 seconds
その結果、指定されたディレクトリで、生成されたPOJOクラスと「正しい」名前のXMLマッピングのセットを取得します。