- PR -

JAVAで多対多の関係を扱う方法って?

投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-08-18 14:56
こんにちは。自分の会社で社員情報が閲覧できるWEBアプリを作成しています。環境は、windowsXP、JAVASDK1.42,データベースはMYSQL、TOMCAT5.19です。社員の情報の中で、1対1の関係で表現できる情報(血液型、入社日、性別、氏名)等は表示させることが出来たのですが、多対多の関係(取得免許情報、家族構成)について、どのように表示させるべきか悩んでおります。ResultSetオブジェクトには階層化されたデータは格納できないようなので、社員数分ループしてSQLを発行し、ResultSetを作り直してやるしかないのか…でもそれじゃああまりにも非効率なような…。VisualVasicにADODBという階層化データオブジェクトを扱うことの出来るAPIがあったのですが、そんな感じのとにかく効率的に階層化データを扱う方法を探しています。JAVA自体はじめて間もないのでどんなことでもありがたいです。ご教授いただけるとうれしいです。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-08-18 16:07
永井です。

要件としては「1社員に対してn(不定)個のエントリーがある情報を社員リストの一部として取得/表示したい」ということで宜しいでしょうか?
#「多対多」という表題ですが、実際には「1対多」の複数件取得ですよね?

その用途に便利なクラス等は知らないので、力技ですが……

1. 社員数分(実際には表示対象分)ループしてSQLを発行する
2. 1対多部分に合わせて1対1部分を冗長に取得する
3. 1対多部分を展開した表示用テーブルを作っておく

……以上3つくらいの方法をまず思い付きます。

1の方法はtakeさんが書かれているそのままの方法です。複数回SQLリクエストが発行されますが、私なら気にしません。確かにResultSetはループした分だけ作られますが、PreparedStatementは使い回し出来ますし。個人的にはこれが一番のお奨めです。

2の方法は、例えば以下のような結果セットを使ってリストを作るというものです。

コード:
1001 山田 太郎 男 C
1001 山田 太郎 男 Perl
1001 山田 太郎 男 Java
1002 鈴木 花子 女 C
1002 鈴木 花子 女 C++



この方法では、データ転送量自体が(冗長部分のために)大きくなること、関係が1対0..nでは適用出来ない(子表のエントリーが0であるデータは結果セットに入ってこないため)こと……等に注意する必要があります。

3の方法は閲覧が非常に多く、更新が少ない場合には有効かも知れません。が、データ整合で破綻をきたさないよう、更新系のロジックには気を付ける必要があります。

引用:

社員数分ループしてSQLを発行し、ResultSetを作り直してやるしかないのか…でもそれじゃああまりにも非効率なような…。



この部分に対する感覚の相違の問題でしょうか。私にはResultSetを作り直してやることが非常に効率的に感じられるのです……。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-08-18 17:08
永井さん、お返事ありがとうございます。よく見ると(よく見なくても)1対多ですね(>_<”)申し訳ないです。PreparedStatementというものを知らなかったもので、非効率に見えてしまったのです。仕様書をチェックしたのですが、パラメータのみの変更でSQLが発行できるんですよね?仕様書の見かたもあまりわからないので使い方も理解するのに何日かかかると思うのですが、がんばろうと思います。それと気になることがあるのですが、JSPとサーブレットというキーワードでいろいろ検索していると、「JSPに直接SQL文を埋め込むのは危険」という文章に遭遇しました。面倒でもサーブレットかBeanに書いて呼び出す方法の法がいいのでしょうか?
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-08-18 21:27
私のお薦めです。
http://www.ibatis.com/common/sqlmaps.html

ドキュメントですが、チュートリアルではシンプルな使い方しか書いていませんが、チュートリアルでない方のには1対Nのやつも一発で取ってこれるやり方が書いています。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-08-19 14:57
ありがとうございます。いろいろやってみます(⌒_⌒)
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-08-19 15:32
自分で読み返してみて違和感を拭えなかったので、ちょびっと自己フォローとかです。

引用:

この部分に対する感覚の相違の問題でしょうか。私にはResultSetを作り直してやることが非常に効率的に感じられるのです……。



「効率的」という言葉に関してですが、「処理が『効率的』」であるものと、「製造作業(コーディング)が『効率的』」であるもの……2つありましたね。
takeさんの文章を読み返してみると、求められていた「効率」は後者、「製造作業の効率」のようです。私のレスは前者を念頭に置いたもので完全に的外れでした。申し訳ありませんでした……。

引用:

になることがあるのですが、JSPとサーブレットというキーワードでいろいろ検索していると、「JSPに直接SQL文を埋め込むのは危険」という文章に遭遇しました。面倒でもサーブレットかBeanに書いて呼び出す方法の法がいいのでしょうか?



JSPも結局はコンパイルされてServletになるはずなので、「JSPは特に危険」とか、そういう意識は私には無いのですが……。
ただ、データ取得・更新等の処理はServletで済ませておいて、Forward先のJSPでは表示に専念……というのが構成がスッキリするので、個人的に好みではあります。ので、自分が関わるのなら、JSPに直接SQL文を埋め込みはしないです。



[ メッセージ編集済み 編集者: 永井和彦 編集日時 2004-08-19 15:37 ]
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2004-08-19 23:49
永井さんいろいろ教えていただいてありがとうございます。やっぱりJSPは表示専門ですよね!なんかだんだん考えがまとまってやる気が出てきました。またいろいろ教えてください!ありがとうございました。
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-08-20 11:36
こんにちわダメ猫です。

先ほどはパスワードエラーとかでなぜか上手く投稿ができませんでしたすいません。

皆様は構造化データにこだわってらっしゃるのでしょうか?
引用:

社員数分ループしてSQLを発行し、ResultSetを作り直してやるしかないのか…


とありますが、DBの構成は次の様になっているのですよね?
・社員情報
・家族構成
・取得資格

この構成ですとSQLの発行は3回で良いのでは?
取得したデータはリストかVectorに保存して(各テーブルにつき1つ)
それをfor文かif文で表示すれば良いのではないでしょうか?
僕はいつもこの方法を取っていますが・・・・
他に良い方法があるのなら教えてほしいですw

[ メッセージ編集済み 編集者: ダメ猫 編集日時 2004-08-20 11:46 ]

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