というわけで、Hibernate on Rails作ってみました。
納品準備で、ぼくの作業は21時くらいに終わったんだけど5時まで作業自体やってて、それにつきあってる間に組んでみました。
http://www.fk.urban.ne.jp/home/kishida/soft/hibernateonrails-preview.zip
動かすのに必要なのは、Hibernate3/Velocity1.4/Javassist3.0です。
こんな感じのテーブルを用意して
craete table maker( maker_id int4 primary key, -- メーカーコード maker_name text );
こんな感じのマッピングファイル???を用意して
package mapping class Maker{ }
こんな感じでリストを取得して
Connection c = DriverManager.getConnection(db, user, pass); Configuration cfg = new hibernate.onrails.CreateMapping(c, new Configuration(), "mapping").setupClass(Maker.class, "maker").getConfiguration(); SessionFactory sf = buildSessionFactory(); c.close(); Session s = sf.openSession(); List l = s.createQuery("from dbMaker").list(); VelocityContext vc = new VelocityContext(); vc.put("makers", l);
こんな感じのVelocityテンプレートに突っ込むと
#foreach($maker in $makers) $maker.makerId : $maker.makerName #end
それなりに表示されます。
内部でMakerクラスを継承してdbMakerクラスを作って、それをHibernateに登録するようにしています。だから、"db" + 「登録したクラス名」でHQLなどを書きます。
基本的に、MiddlegenでHibernateのマッピング作ったときと同じようなプロパティを生成してます。
Javaコードでプロパティを操作したいときは
class Maker{ public Integer getMakerId(){ return null;} public String getMakerName(){ return null;} }
と、仮のアクセッサ用意しておくと勝手にオーバーライドするので
for(Maker maker : (List)s.createQuery("from dbMaker").list()){ System.out.printf("%d : %s%n", maker.getMakerId(), maker.getMakerName()); }
と書けます。でも、引数・戻値にマッピングクラスが使えないので、いまのとこMany-to-Oneでは無理です。
内部でキャストするアクセッサを作ればいいだけですけど。
基本的には、普通にマッピングクラスのソースを自動生成したほうが小回りも効いていいです。
ただ、Hibernateなどのエンジン自体にこの機構をもたせて、Javaコードでの処理には使わない、入力・表示だけの雑多な項目を勝手にマッピングするようにして、コアな項目だけマッピングを記述するようにすれば、表示用項目の追加のときにマッピングをいじくらなくてもよくなります。
それでも、賢くソースの自動生成すればいいだけとは思いますけど。