トップページtech
983コメント363KB

Java⇔RDBのMapping-Frameworkを語るスレ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
●各種Framework
[Torque]
http://db.apache.org/torque/
http://homepage1.nifty.com/kingyoshi/computer/jakarta/torque.htm

[HYBERNATE]
http://hibernate.bluemars.net/1.html

[CasterJDO]
http://www.castor.org/jdo.html
http://www-6.ibm.com/jp/developerworks/java/021025/j_j-castor.html

[ObJectRelationalBridge (OJB)]
http://www.terra-intl.com/jakarta/ojb/

●コネクション・プーリング
[Jakarta Commons DBCP]
http://jakarta.apache.org/commons/dbcp/
(Jakarta Commons DBCPを使ってみよう。)
http://taka-2.com/jclass/DBCP/
(DBCP利用法 from "『カモン!Commons!』 Jakarta Commonsを使ってスキルアップ" (2002/09))
http://www.mobster.jp/wiki/index.jsp?pid=Commons#i10
0653デフォルトの名無しさんNGNG
日本語の方が負の遺産だわな。
文字コードなんて複数あるんだし。
0654デフォルトの名無しさんNGNG
今イジってるPHP+MySQLのシステム、
1つのカラムに、PHPのオブジェクトをシリアライズしたやつが入ってるYO!
氏ね
0655デフォルトの名無しさんNGNG
>>652
そだね。
DbUtils程度で押さえておくのも一つの手かもね。
0656デフォルトの名無しさんNGNG
UTF-8がOSでもDBでもの文字コードの標準になればなんとかなるだろ。
0657デフォルトの名無しさんNGNG
>>656
Oracle使ってると、それでも問題は出る。
なにがへぼいって、varchar2をバイト数で指定するところ。
UTF-8だったら1文字当たり3バイトで計算とかだし。
ありえなくなーい?
0658デフォルトの名無しさんNGNG
>>657
だから、標準になったらだろ?
0659デフォルトの名無しさんNGNG
2chでマッピングツール作るってのはどうですか?
0660デフォルトの名無しさんNGNG
>>659
つくれるやつは、いろいろいるだろうが、
画期的な発想が思い付けないよね。
結局あれと同じジャンみたいな。

も前はどんなのが欲しいんだ。
0661659NGNG
>>660
例えばSQLを外部で管理( XML(SAP),DB等 )っていう方法
外部ファイルにオリジナルのSQL,INPUTパラメータ等を書く。
次にデータ設定用のクラスを作る。(String, int, Dateなどの動的配列(MAPとか) )

使用方法
1・外部データ作成時のSQL固有のキーを使用してオリジナルSQLを取得
2.INPUTパラメータがあればsetParam( ... ) で設定
3.SQLを完成させ、DBクラスに渡す。
4.DBクラスがDBのメタデータを元にデータ設定用のクラスの
  適切な型にデータを設定
5.データ設定用クラスから列名で値を取得する。

肝はメタデータを使うってとこですね。
かなり思い付きです。
つっこみお願いします(w
0662デフォルトの名無しさんNGNG
>>661
複雑なSELECTの扱いや、
VIEWやSTOREDなどと、どう切り分けるかが鍵ではないでしょうか?
その辺りはどう考えています?
0663デフォルトの名無しさんNGNG
システムごとのマッピング程度なら、自分で書いてもそれほどじゃないんだよね。
如何に汎用にするかが問題になるわけで。
0664659NGNG
>>662
複雑なSQLとは具体的にどのようなものでしょうか?
VIEWはまだ考えていません(w
0665デフォルトの名無しさんNGNG
CASE WITHとか、FROM句にサブクエリ入れて条件絞ったりとか、
UNIONで完全外部結合やったりとか、OracleでSELECT 〜 START WITHやったりとか?
0666659NGNG
>>665
それは大丈夫。
Statement$executeQuery後のResultSetを元に最終的に取得する列名などが分かるので。
あとHashtableを継承したクラスでgetメソッドをラップすれば使用する側でキャストする必要がなくなります。
(getString,getIntとか)
ストアドも同じ感じでいけそうです。
0667デフォルトの名無しさんNGNG
なんとなく汎用にすればするほどラップする意味なくなるくらい
外部ファイルに書く必要がでてきちゃって何したかったのかわからなくなる罠
0668デフォルトの名無しさんNGNG
そもそもそれって汎用マッピングツールを作るのは無理じゃないかと思うから、
そこらへんあきらめて、代わりにただのSQL文を簡単に使える仕組みを提供するとか、、?
0669デフォルトの名無しさんNGNG
>>661
それって、Sqletとあまりかわらないような。
http://homepage3.nifty.com/seasar/nazuna-sqlet.html
JavaBeansやMapへのマッピングまでやってくれるけど。
0670デフォルトの名無しさんNGNG
SQLの規格に従わない馬鹿をこらしめてやりたい。
諸悪の根源はベンダそのもの。準拠しないC++コンパイラが
ろくでなし扱いされるのとは大違いだな。まったく。
0671659NGNG
>>669
既にそんなものが(w
…でこういうのって需要ないのでしょうか?
Sqletを使われた人います?
0672デフォルトの名無しさんNGNG
>>670
スレ違い気味だが、激同。
ベンダー拡張使うなとは言わんが、互換性は持たせとけよと思う。
でも、DB屋さんってそういうとこ全然無頓着なんだよね。
以前仕事した人と話したとき、「なんで?DB違うんだから、当たり前じゃん」ってな反応だった。
そいつらが変わらん限り、ベンダは囲い込みが出来るわけだし、状況も変わらんなと思った。
0673デフォルトの名無しさんNGNG
>>666
それはResultSet->Objectの話でしょ?
それ自体が問題になることはあまりないように思う。

そうではなくて、クエリの自動生成をどのように行うか
ということ>662は言いたかったのではないのかな?

実際そこがキモになると思うんだけど...

0674659NGNG
>>673
まさにSqletのように外部ファイルに書くって方法です。
使う側では検索条件があればINPUTを設定するだけ。
でgetString("列名"),getDate("列名")てな感じで呼ぶ。
XMLじゃなくてプロパティファイルにするなら
master.sql_1=select * from hoge where id ={0}
みたいにできるかなと。

…こういうのは使えないですか?(w
0675673NGNG
>>674
人によっては使うんでないかと思うよ。たぶん。
誰もが1度は考える方法だと思うし。

個人的に欲しいものは、
1.クエリがDBセーフで記述できる。
2.クエリを記述せずに、ある程度複雑なクエリを発行できる。
かな。

ちなみにTorqueは使いづらいと思っているけどね。
0676デフォルトの名無しさんNGNG
マップすると表形式でぐるぐる回して表示したい時に、逆に面倒なんだよね。
マップしないと、それ以外のすべてが面倒。
0677659NGNG
>>675
> 1.クエリがDBセーフで記述できる。
これはTorqueがやってますね。(未実装が多いけどw)
個人的にはSQLは自分で書きたいほうなので今のまま作ってみます。
あとTorqueみたいにたくさんのクラスを自動生成ってのは嫌ですね…。

>>676
MAPを継承したクラスを使えばいろいろできそうですが…。
0678デフォルトの名無しさんNGNG
出来る出来ないじゃなく、RSより面倒か面倒でないかの話だろ?
0679デフォルトの名無しさんNGNG
>>675
個人的にはある程度複雑なクエリを書く必要が出てくるんなら
素直にSQL書いたほうが早いと思うんだよね。

少なくともSQLは良く出来た言語だし、RDBのデータをOOAして
作ってきた側からから扱おうと思っても見過ごせないくらいの
ギャップが表面化するだけじゃないかと。
0680デフォルトの名無しさんNGNG
Commons DbUtilsってSqletと似たようなもん?
0681デフォルトの名無しさんNGNG
>>680
プログラマにSQLは書いてもらうけど、
底辺のJDBC APIはフレームワークが処理するという
意味では同じだね。

SOA(SQL Oriented Approach)
0682デフォルトの名無しさんNGNG
つーか、SQLが統一されれば問題ないんだろ?
Oracle8が無くなるまでの辛抱だ。
0683デフォルトの名無しさんNGNG
オブジェクト→いきなりただのテキスト→SQL→RDB→実行してみないと
結果わからん→JavaのデバグかSQLのデバグかわからん→1にもどる

コンマやスペースの所為で実行時エラーになるのは正直ウザい。
エラーになりゃまだいいけど、一生エラーにならんかもしれん。
でも、現状のO-Rマッパは、マッピングの設定がもっとウザい。

ってことで、俺はDbUtils。カユいところに手が届いてて良い感じ。
0684デフォルトの名無しさんNGNG
DbUtils 簡単そうで激しく気に入った。SQL 読み込みローダも付いてんだね。
ところで DB から Bean を作成する簡単ツールとか付いてこないんすかね?
0685デフォルトの名無しさんNGNG
俺もDbUtilsがいいと思う。
SQL書かないとね。
0686684NGNG
>>685
禿げ同。 やっぱりほとんど制約なしでそのまま SQL で書けるのは良い。

>>684 読み込みローダ
。。。今見たら俺、馬鹿っぽさ爆発じゃないか。
0687デフォルトの名無しさんNGNG
>684
>DB から Bean を作成する簡単ツール

禿げしく欲しいが、多種多様のDBに対応させるために膨大なツールになって、
(DBのマイナーバージョンまで対応せんと、型のマッピング変わってたりするし)
「あんまつかえねえなぁ〜」とかなりそう。結局、ExcelマクロとかPerlスクリプトとかで
ゴリゴリ作ってるほうが案外幸せなのかも。ある意味マッピングフレームワーク。
0688683 & 687NGNG
あ、いや、Torqueとか市販のO-Rマッパーの存在を否定してるわけじゃないのよ。
いろいろ試してみて、現状ではそう判断した。設定が簡単で軽いフレームワークが
あれば、今にでも飛びつきたいところなんだが。
0689デフォルトの名無しさんNGNG
DBUtils + (Generics + 可変長引数) = (゚д゚)ウマー
0690デフォルトの名無しさんNGNG
うちの開発部ではExcelのマクロ使って仕様書から生成してら。
0691デフォルトの名無しさんNGNG
>689
仕事で使えるのはいつになるのやら。
0692デフォルトの名無しさんNGNG
8月アップの案件でDbUtilsは採用決定。1.5はどうかなぁ…。
0693デフォルトの名無しさんNGNG
DbUtilsは普通に採用するが、1.5はなー
特別な事情がなければ今年中は無いんじゃないかなー そうでもない?
新しい仕様はみな微妙なものばかりだし、
すぐ使いたがるやつvs覚える気無いやつで内戦が起こりかねないし
コーディングルールだって直さないといけないからな・・・
0694デフォルトの名無しさんNGNG
間違ってたらごめんだが1.5ってまだreleaseしてないでしょ?
そんなもの仕事で使うの?
それはさすがにうちの会社ではありえん。
0695デフォルトの名無しさんNGNG
普通に考えたら新しい(beta含む)技術なんかリスクありありで
仕事で使わんな。でも新しい技術使いまくってアピールに
成功してる会社はあるな。ごく少数だけど。そっちのほうが
面白そうだ。
0696デフォルトの名無しさんNGNG
確かに面白そうではあるがリスクを誰が負うかが問題だな。
会社の方針としてあるのであれば使えるんだがね。
0697デフォルトの名無しさんNGNG
>>696
そのリスクを評価するのがエンジニアの仕事でしょうが
0698デフォルトの名無しさんNGNG
>>697 が責任を負います。
0699デフォルトの名無しさんNGNG
>>697
評価してるうちに正式版が出るわな
0700デフォルトの名無しさんNGNG
自分で一から書いたってリスクはあるんだから、
あり物使っても一緒だと思うよ。
金あるなら、MSとかOracleとかに囲われて
楽々やるのもいいかも知れないけど。
0701デフォルトの名無しさんNGNG
>>699
J2SE1.5 をいつもで評価する気?
えらくのんびりしたプロジェクトだな。
0702デフォルトの名無しさんNGNG
他人のリスクを自分で負うのと
自分のリスクを自分で負うのは
違う

たとえ他人のもののほうが自分のものより品質が良くても
0703デフォルトの名無しさんNGNG
あり物レベルのものが予算内で作れるなら、
自分で創って自分で責任負えばいいじゃん。
それが出来ないから、人を削って製品を買うか、
不具合覚悟であり物検証して使うかしてるんだって。
0704692NGNG
あぁ、すまん。1.5どうすっぺの言い出しっぺです。試作版が8月アップで、
正式版が来年春予定なのよ。んなもんで、DbUtils+1.5の組み合わせも一考の余地ありかと。
一考したけど、やっぱBeanListHandlerでゴリゴリやります。
0705デフォルトの名無しさんNGNG
DbUtil+DBCPってDbUtil継承して書き換えないと使えないですか?
DbUtilもデータソース使ってるみたいで…。
連携がちょっと厄介かも(w
0706デフォルトの名無しさんNGNG
>>705
おまえの頭を最初に書き換える必要があります。
継承して何を書き換えるつもりなんだ?
0707デフォルトの名無しさんNGNG
Torqueで、

select distinct HOGE from HAGE;

はどう書くんでしょう?

criteria.setDistinct();

のあるなし以前に、

Criteria criteria = new Criteria();
criteria.addSelectColumn(HagePeer.HOGE);
HagePeer.doSelect(criteria);

が、

com.workingdogs.village.DataSetException: Only 1 columns exist!

で落ちてしまい、困っています。
0708デフォルトの名無しさんNGNG
>>707
SQLと同等なことをするのに四苦八苦するような
フレームワークで時間をつぶすのはもったいないよ。
0709707NGNG
Criteria criteria = new Criteria();
criteria.addSelectColumn(HagePeer.HOGE);
Criteria criteria = new Criteria();
List list = BasePeer.doSelect(crit);
for (Iterator it = list.iterator(); it.hasNext(); ) {
Record rec = (Record)it.next();
System.out.println(rec.getValue(1).asString() );
}

でうまくいきました。
0710デフォルトの名無しさんNGNG
こういう問題があるから速攻止めたんだよな>トルク
そーいやカウントの仕方がいまだわからないやw
0711デフォルトの名無しさんNGNG
JULP
ttp://julp.sourceforge.net/index.html
こんなんどう?

あと、
ttp://homepage2.nifty.com/igat/igapyon/diary/2004/ig040121.html
いが○ょんもなんかやってる。
0712デフォルトの名無しさんNGNG
>>711
> いが○ょんもなんかやってる

仕様案見たけど、これって車輪の再発明じゃないの?
そこのレスにあるけど、同じようなもの作ってる人いるし。

DbUtilsは低機能でORマッパーとは言わないかも
しれないけどシンプルで他と違って光ってるな。
漏れも同じ車輪しか作れないけど、誰かドカンと衝撃があるものを
世に出してください。
0713デフォルトの名無しさんNGNG
特別なマップ記述なしに、SQL発行してBeanのListで返ってくるというDbUtilsは、
JDBCと平のSQLを使ったJava<->RDB間車輪として完成したと言っても過言ではないと思う。
SQLになった時点でJavaと接点が切れるという問題はあるにせよ、相当使い易いもの。

後は、手を動かしてフレームワーク作るより、頭動かして発明するしかねえなぁ。
0714デフォルトの名無しさんNGNG
最終的には、Cayenne + Tapestryで決まりだと個人的に思う今日この頃。
0715デフォルトの名無しさんNGNG
マッピングツールで、Rogue Wave の SourcePro DB ライクなものってありますか?
0716デフォルトの名無しさんNGNG
>>714
Cayenne って他と比べてズバ抜けてるの?
それとも単に今までのORマッパの良いとこどり?
0717デフォルトの名無しさんNGNG
cayenneって、たしかXMLとかでスキーマをこさえてやらんでも
勝手にスキーマ構造を抜いてきてくれるんじゃなかったっけか。
WebObjectsのEnterpriseObjectFrameworkみたいな感じ?
0718デフォルトの名無しさんNGNG
torqueでもRDBからSchema抜き出す機能なかったっけ?
0719デフォルトの名無しさんNGNG
Torqueは、XML書かないとならないのでは?その必要も無し?
1テーブルあたり4クラスもできあがるのは、ちょっといただけないのだが。
0720デフォルトの名無しさんNGNG
Javaじゃないけど、金曜日のYukonセミナーで、
.NET版O-Rマッパーフレームワークみたいのを提供すると言っておった。
やっぱりデータ中心アプリだとO-Rマッパーが必要になってくるよね。
ということかな。
0721デフォルトの名無しさんNGNG
Hibernateは楽だぞ
0722デフォルトの名無しさんNGNG
Hibernateの楽なところって、具体的にどのへん?
スキーマのリバースとかできるの?
0723デフォルトの名無しさんNGNG
Middlegen で主要なORマッパーのスキーマのリバースは
出来るんじゃないの? ところで Middlegen で DbUtils 用の
Bean 作ったりはでけへんのかな?
0724デフォルトの名無しさんNGNG
>>719
torqueだがbuild-torque.xmlにjdbcターゲットがある。
これ使えば既存のDBからschema.xmlを生成してくれる。
0725デフォルトの名無しさんNGNG
>> 722
HibernateはMiddlegen + Middlegen-Hibernate(Hivernateのサイトから)で
スキーマのリバースが可能。
0726デフォルトの名無しさんNGNG
>>722
Eclipseプラグインのjfacedbc使ってもいけそうですね。
0727デフォルトの名無しさんNGNG
>723
Middlegenの素のままでは融通が利かないかもだけれども、
仕組みは結構単純なんで、自分プラグイン+Velocityで
結構なところまでいけるのでは?
0728デフォルトの名無しさんNGNG
【ゴールデンレス】
このレスを見た人はコピペでもいいので
10分以内に3つのスレへ貼り付けてください。
そうすれば14日後好きな人から告白されるわ宝くじは当たるわ
出世しまくるわ体の悪い所全部治るわでえらい事です
0729デフォルトの名無しさんNGNG
なーおまいら JTA って使ってますか? ORマッパーと組み合わせて使うと
トランザクション管理が楽そうだけど、ググっても情報少ない。

Tyrex は更新止まってるし、JOMT はどうなんだろ。
ORマッパーに付いてるものとかないんかな?
0730デフォルトの名無しさんNGNG
>>729

素でSQL叩いたほうが楽ってことに気づいたんだよ
0731デフォルトの名無しさんNGNG
JTAなんざEJBコンテナに任しときゃいいんだ
0732デフォルトの名無しさんNGNG
>>730
いや、だから SQL は素でたたいてトランザクション管理だけは
JTA に任せようかと。。。まー落ち目ってことなんですね。。。
0733デフォルトの名無しさんNGNG
>>732
分散トランザクションの方が主な仕事じゃないの?
ローカルトランザクションは普通にJDBCのConnection#commitでしょ。

XA対応とか調べるのメンドクサイけどな。
0734デフォルトの名無しさんNGNG
>>733
EJB みたいに別コンテナまでのトランザクションはいらんけど、
Connection だと複数のクラスにまたがるトランザクションだと
いちいちコネクション渡していくのがめんどくさいなーと。

JTA だったらスレッド内だったら Connection 渡さなくても良いから
楽かな〜と。俺、なんか間違ってる?
0735デフォルトの名無しさんNGNG
ここで相談していることがな。
0736デフォルトの名無しさんNGNG
>>734
なら、ThreadLocalでConnection渡したらどう?
0737デフォルトの名無しさんNGNG
>>736
うぉぉ。ありがトン。ThreadLocal って名前しか知らんかった。
トリッキーそうだと思って Jacadoc 見たら、用途にトランザクションID とかって
ありました。これって EJB とかが内部で使ってんのかな?
0738デフォルトの名無しさんNGNG
JTAは普通ThreadLocal使って実装。
0739デフォルトの名無しさんNGNG
>>713
+BeanUtilsで、SwingともJSPとも相性いいな、それ。

すごい立派なシステム作るわけじゃなければ、それで平のSQL投げるのが
いちばん簡単なのかもね。
結局RDBMS固有のチューニングテクニックとかのお世話になる羽目になった
とき、平でSQL投げているほうが分かりやすいだろうし。
変な仕組みにSQL生成を任せてしまうと、わけわからなくなって困らへん
かな?

SQLを外部ファイルに切り出して、必要に応じてIDかなにかで呼び出す程度
がええのかな。
0740デフォルトの名無しさんNGNG
>>729
Hibernate + Spring Framework でこんなに簡単にできるよ
http://hibernate.bluemars.net/110.html
0741デフォルトの名無しさんNGNG
>>740
こっちも
http://www.springframework.org/docs/wiki/Spring_AOP_with_Hibernate.html
0742デフォルトの名無しさんNGNG
>>740
簡単じゃないができてるね。
読むだけで疲れたけど。
Springってすげって思うけど、なんかおやじが説教してるみたいな
感覚するんだよね。
うるせーって感じ。
0743デフォルトの名無しさんNGNG
>>742
この仕事に向いてない人だな。
自由にやられると、周りが困る。
0744初期不良NGNG
と言うか O-R マッピングって DB の種類に
依存しないためでもあるんじゃないの?
SQL たたく方が楽ってそりゃそうだけど
じゃあなんで苦労してコストもかけて
こんな事やっているのかと小一時間
0745デフォルトの名無しさんNGNG
>>744
本来そうかもしれんけど、俺は DB 置き換えが必要になった
PJ はあったことがない。あー ORマッパー使ってりゃ楽っだったのに!
とか普通はない。あんた、どう?
0746デフォルトの名無しさんNGNG
「思想的にしたくないことをやらなくてすむ」ってとこに意義があるんじゃないの。
まともなODB出たら、JavaでRDBとO-Rマッパなんか使う人はいないわけで。
0747デフォルトの名無しさんNGNG
>>746
>「思想的にしたくないことをやらなくてすむ」ってとこに意義があるんじゃないの。
結論はこれだと思う。

やっぱりオブジェクト指向な環境では、なるべくSQLなんつー対極的なものは使いたくないな。
ロジック中にSQL埋め込みたくないし(SQLも手続き的ロジックなわけだけど)、かといってSQLを
外出しにしたくもない。
オブジェクトの曼荼羅の中にSQL入れるなんて、清濁併せ呑むって感じがする。
ましてや、WebアプリなんかでPHPの中に、HTMLと一緒にPHPのロジックとSQLを混在させるような
腐った設計なんてのは問題外じゃねーの。

以上、個人的好みが多めだけど、客観的なOOP論は少なめ。これ。
オブジェクト指向は万能ではないってところも押さえないと。ね。

とりあえず、Hibernate / Cayenneマンセー
Torque / JDOはウンコ。
0748初期不良NGNG
>>745
確かに DB 置き換えと言う事はあまり無い。
ローカルのテスト環境で別 DB を入れてテストするくらいかな。
けど、プロジェクト単位で DB 入れ替えとか言う話じゃなくて
こっちが複数の DB の独自仕様を意識しなくていい
と言うところじゃない?

思想的に、っていう話もわからないでもないけど、
漏れの場合は必要性如何に関わらず、抽象化を
進めた先に何かがあると信じてついて行く所存なり。
データをグラフ化したら違う何かが見えてきたってな感じのね。
0749デフォルトの名無しさんNGNG
これからは、1つのオブジェクトに、物理的に異なる鯖に配置されてる
アーキティクチャのことなるRDBのテーブルをマッピングして使う、
なんていうことが当たり前にできるようになりそうだね。
WebObjectsのEOFなんかが、かなり前から実現していた世界だけれど。
それがLGPLやASLなんかの製品でできるようになることの
ビジネス的なインパクトってどのくらいあるかな。

0750デフォルトの名無しさんNGNG
>>749
EJB
0751デフォルトの名無しさんNGNG
>>747
> とりあえず、Hibernate / Cayenneマンセー
> Torque / JDOはウンコ。

おい、マンセーの理由を教えてください。
0752デフォルトの名無しさんNGNG
>>751
個人的好みです。
使いたいものをプロジェクトの性格に併せて選択すればいいです。
JDBC+生SQLという選択肢も当然アリかと。
■ このスレッドは過去ログ倉庫に格納されています