きしだのはてな このページをアンテナに追加 RSSフィード

2005-08-01(月)

[]メモ 06:20 メモ - きしだのはてな を含むブックマーク

Tseihin s = new Tseihin();
s.setCode(1);
sess.refresh(s);

のようにしてデータを取得しようとすると、初めての呼び出しではうまくいくけど、すでにデータがキャッシュされているときにはうまくいかない。

2005-06-30(木)

[]無定義Hibernateの修正 06:53 無定義Hibernateの修正 - きしだのはてな を含むブックマーク

内部で生成しているhbm.xmlDTD指定がHibernate2.0のままで、Hibernate3だとネットからDLして確認するので、ネットにつながってない環境では動かないのに気付いて、ちゃんと3.0に変更しました。

というか、そのくらい普通のhbm.xmlを内部で生成しています。

無定義Hibernate


データベースのカラムを追加してもJavaコードから操作しないのであればマッピングをいじる必要がないというデモをしたのですが、実際やってみるとなかなかいい感じと自分でも関心。

Mapを使う場合と比べていいのは、必要なところでアクセッサが定義できるということですね。


いまのところフィルタの設定なんかができないので、実際には使えないですけどね。そこまでする気もないし。

Javaのコーディングはxxxより楽ですよ、という議論をするときにとてもいい( ̄ー ̄)

higayasuohigayasuo 2005/06/30 16:54 それを考えるのがyuのMLです。(笑)

nowokaynowokay 2005/06/30 20:57 投稿しました。( ̄- ̄)ゞ

2005-06-27(月)

[]RailsみたいなHibernate 13:00 RailsみたいなHibernate - きしだのはてな を含むブックマーク

ということで、RailsみたいなHibernateの説明を書きました。

Many-to-OneをJavaコードから使えるようにしたり、マッピングクラスをインターフェイスとして定義できるようにしたり、ちょっと変更もしています。

なかなか手軽でいいです。

ただ、実際に使えるようにするには、Hibernate自体にこの機構を組み込んだほうがよさそうです。

無定義Hibernate

higayasuohigayasuo 2005/06/27 17:27 ほんとにkだらけだ。(笑)

skimuraskimura 2005/06/27 19:40 できごとの方で見つけたメアドにメールしておきました。

nowokaynowokay 2005/06/27 20:04 了解です。それでは、よろしくおつきあいお願いします。ソース書きますよ。

2005-06-26(日)

[]Hibernate on Railsできました。 07:54 Hibernate on Railsできました。 - きしだのはてな を含むブックマーク

というわけで、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などを書きます。

基本的に、MiddlegenHibernateマッピング作ったときと同じようなプロパティを生成してます。

Javaコードでプロパティを操作したいときは

class Maker{
    public Integer getMakerId(){ return null;}
    public String getMakerName(){ return null;}
}

と、仮のアクセッサ用意しておくと勝手にオーバーライドするので

for(Maker maker : (List<Maker>)s.createQuery("from dbMaker").list()){
    System.out.printf("%d : %s%n", maker.getMakerId(), maker.getMakerName());
}

と書けます。でも、引数・戻値にマッピングクラスが使えないので、いまのとこMany-to-Oneでは無理です。

内部でキャストするアクセッサを作ればいいだけですけど。


基本的には、普通にマッピングクラスのソースを自動生成したほうが小回りも効いていいです。

ただ、Hibernateなどのエンジン自体にこの機構をもたせて、Javaコードでの処理には使わない、入力・表示だけの雑多な項目を勝手にマッピングするようにして、コアな項目だけマッピングを記述するようにすれば、表示用項目の追加のときにマッピングをいじくらなくてもよくなります。

それでも、賢くソースの自動生成すればいいだけとは思いますけど。


まぁ、JavaでもRailsはできるよ、ってことでした。

2005-06-08(水)

[]Hibernate3でupdateやdeleteが失敗するとき 21:28 Hibernate3でupdateやdeleteが失敗するとき - きしだのはてな を含むブックマーク

Hibernate3からQueryでupdateやdeleteができるようになったということだったんだけど、どうもうまくいかなかった。

で、いろいろ試したら、うまくいくテーブルとうまくいかないテーブルがある。

マッピングでwhereの設定に"not delete_flag"とか書いてるテーブルだった。

ということで、マッピングのwhereの設定には"1=1 and not delete_flag"とか"delete_flag=false"とか、「=」を使った条件が必要らしい。

で、"delete_flag=false"だと"_this.delete_flag=_this.false"とかに変換されて抽出がうまくいかないので、"1=1 and not delete_flag"にする必要がある。

へんなの。