- - PR -
Hibernateでツリー構造(Compositeパターン)はキツイ?
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-10-12 13:45
Hibernateを使用したツリー構造を実現したいと思いそれっぽいモノを作成してみました。
どなたか、このような事例に当たった方がいましたらご教授おねがいします。 【問題】 問題になっている部分は、なんとなく処理が重そうな気がするところです。 重くないのか軽いのか? 重い場合階層を分割して取得できないか?(必要な階層数を指定できると素敵) 【前提条件など】 Hibernateでマッピング定義のXMLをone-to-manyを使いツリー構造を作りました。 以下はその事例を簡単にしたものです。 [SQL] CREATE TABLE Category ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(10), parent INTEGER ); ここで、ID=0はルートとするものと仮定します。parentは親のノード(カテゴリID)を指します。 [マッピング定義] <set name="nodes" > <key ><column name="parent" /></key> <one-to-many class="sample.Group" /> </set> ↑のような設定で実際にオブジェクトを取得してくると、ツリー構造化されたものが取得できました。 なお、階層の深さは制限がありません。 |
|
投稿日時: 2004-10-12 14:12
Hibernateは詳しくないのですが、とりあえずベンチマークとって比較してみてはいかがでしょう?
|
|
投稿日時: 2004-10-12 15:10
私が試した結果では「重い場合階層を分割して取得」のような
気の利いた事は出来ません。 従って、データが多くなったり階層が深くなると激重ですよ。 |
|
投稿日時: 2004-10-12 15:30
ベンチマークはとっていませんが、
hibernate.cfg.xmlで発行されたSQLをログに吐き出だす プロパティ(show_sql)をtrueにしてみたところ。 集約を辿るたびにSQLが発行されているので階層が深いと遅そうな気がします。 色々と調べてみたところ遅延初期化をすることで「集約を辿るたびにSQLが発行」が防げそうです。 (未確認) [遅延初期化] http://www.geocities.jp/ogaponman/TechnoInf/Hibernate/html_single/index.html#collections-lazy |
|
投稿日時: 2004-10-12 17:38
確かに遅延ロードを使うと必要になったときにSQLを発行するので、
一部分だけ欲しいのであれば、有る程度ましにはなると思います。 ただ、Sessionをまたいでしまうと、遅延ロードできないので注意が必要です。 もちろん回避方法は有りますが、HTTPのようにステートレスだと面倒ですね。 |
1