- PR -

Hibernateでツリー構造(Compositeパターン)はキツイ?

1
投稿者投稿内容
会議室デビュー日: 2004/10/12
投稿数: 14
投稿日時: 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>

↑のような設定で実際にオブジェクトを取得してくると、ツリー構造化されたものが取得できました。

なお、階層の深さは制限がありません。
Odakaz
ベテラン
会議室デビュー日: 2004/05/24
投稿数: 70
投稿日時: 2004-10-12 14:12
Hibernateは詳しくないのですが、とりあえずベンチマークとって比較してみてはいかがでしょう?
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2004-10-12 15:10
私が試した結果では「重い場合階層を分割して取得」のような
気の利いた事は出来ません。
従って、データが多くなったり階層が深くなると激重ですよ。
会議室デビュー日: 2004/10/12
投稿数: 14
投稿日時: 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
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2004-10-12 17:38
確かに遅延ロードを使うと必要になったときにSQLを発行するので、
一部分だけ欲しいのであれば、有る程度ましにはなると思います。
ただ、Sessionをまたいでしまうと、遅延ロードできないので注意が必要です。
もちろん回避方法は有りますが、HTTPのようにステートレスだと面倒ですね。
1

スキルアップ/キャリアアップ(JOB@IT)