[Hibernate] Hibernate SynchronizerによるDAOパターンの実装 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

データアクセス部分をDAOパターンで実装する場合、どうしてもお決まりのコードの記述量が増えてしまいます。


各DAOクラスに共通の処理を基底クラスに実装するなどしてコーディング量を多少減らすことはできますが、それでもかなりのコーディングが必要です。


しかし、Hibernate Synchronizer というEclipseのプラグインを使うと、DAOパターンとGeneration Gapパターンに基づいたJavaBeansとDAOクラスを自動的に生成することができ、コーディング量を大幅に削減することができます。


またビジネスロジックとデータアクセスロジックを分離でき、データモデルや実装方法の変更にも強い構造となります。

インストール
Hibernate SynchronizerはEclipseのメニューから[ヘルプ]-[ソフトウェア更新]-[検索とインストール]で新規リモートサイトとして以下のサイトを登録してインストールします。

URL:http://www.binamics.com/hibernatesync/

JavaBeansとDAOクラスの生成

Hibernate Synchronizerを使ってJavaBeansとDAOクラスを生成するには、Eclipse上でHibernateのマッピングファイル(*.hbm.xml)を右クリックし、ポップアップメニューから[Hibernate Synchronizer]-[Synchronize Files]を選択します。


すると、以下のようなクラスができあがります。


HibernateSynchronizer


※hbm2javaなどで生成したJavaBeansが既に存在している場合は、上書きされないためあらかじめ削除しておく必要があります。

これらのクラスをクラス図で書くと以下のようになります。


HibernateSynchronizerClass

baseパッケージに含まれるクラスについてはSynchronize Filesを実行するたびに自動的に書き換えられるもので、開発者が直接手を加えてはなりません。


このbaseパッケージに含まれる基底クラスには基本的なCRUD操作を行うためのメソッドが実装されており、これらの基底クラスを継承したJavaBeansやDAOクラスを使用すれば基本的なCRUD操作についてはコーディングが一切不要です。


findByXXXXXメソッドなど開発者が独自の処理を追加したい場合は、JavaBeansやDAOクラスにコードを追加します。


Hibernate Synchronizerではこのような構造にすることにより、DAOパターンとGeneration Gapパターンを適用しているのです。

生成したJavaBeansとDAOクラスを利用したデータアクセスプログラムの作成
Hibernate Synchronizerを使用して生成したJavaBeansとDAOクラスを何もいじらずにそのまま使用して簡単なデータアクセスプログラムを作ってみるとこんな感じになります。

package scott;

import scott.dao._RootDAO;
import scott.dao.DeptDAO;

public class DeptCRUD {

    public static void main(String[] args) throws Exception {

        _RootDAO.initialize();

        DeptDAO deptDAO = DeptDAO.getInstance();
        Dept dept = null;
        
        try{
            System.out.println("------ 登録 ------");
            dept = new Dept();
            dept.setDeptno(new Integer(99));
            dept.setDname("Develop");
            dept.setLoc("Tokyo");
            deptDAO.save(dept);
        } catch (Exception e ) {
            e.printStackTrace();
            return;
        }
        
        dept = null;

        try{
	        System.out.println("------ 読込 ------");
	        dept = deptDAO.load(new Integer(99));
	        System.out.println("DEPTNO:"+dept.getDeptno());
	        System.out.println("DNAME:"+dept.getDname());
	        System.out.println("LOC:"+dept.getLoc());
	
	        System.out.println("------ 更新 ------");
	        dept.setLoc("Osaka");
	        deptDAO.update(dept);
        } catch (Exception e ) {
            e.printStackTrace();
            return;
        }
	        
        dept = null;

        try{
	        System.out.println("------ 再読込 ------");
	        dept = (Dept) deptDAO.load(new Integer(99));
	        System.out.println("DEPTNO:"+dept.getDeptno());
	        System.out.println("DNAME:"+dept.getDname());
	        System.out.println("LOC:"+dept.getLoc());
	        
	        System.out.println("------ 削除 ------");
	        deptDAO.delete(dept);
        } catch (Exception e ) {
            e.printStackTrace();
            return;
        }

    }

}

Hiberanteの"ハ"の字も出てこないビジネスロジックとデータアクセスロジックが分離された見事なDAOパターンです。


このような実装にしておくと、ビジネスロジックを開発するユーザーはHibernateに依存したコーディングを行う必要がなくなり、Hibernateを使っていることすら(基本的には)意識する必要がなくなります。


ということはどういうことかというと、EJB3.0に乗り換えましょうとか、ここだけはSQLを直書きしようというような話になったとしても、(基本的には)DAOクラスやJavaBeansを置き換えるだけでビジネスロジックは変更しなくて済むということです。