トップページtech
1001コメント353KB

Java⇔RDBのMapping-Frameworkを語るThre Vol.3

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
Prevoius Thread
「Java⇔RDBのMapping-Frameworkを語るスレ Vol.2」
http://pc5.2ch.net/test/read.cgi/tech/1086315004/
「Java⇔RDBのMapping-Frameworkを語るスレ
ttp://pc5.2ch.net/test/read.cgi/tech/1049030272/

●まずは、基礎知識と技術選択指針など
 [The Fundamentals of Mapping Objects to Relational Databases]
  (RDBに対するオブジェクトマッピングの基礎(英語))
  ttp://www.agiledata.org/essays/mappingObjects.html

 [O/R-Mappingツールの比較サイト(英語)]
  ttp://c2.com/cgi-bin/wiki?ObjectRelationalToolComparison

 [Catalog of Patterns of Enterprise Application Architecture]
  ttp://www.martinfowler.com/eaaCatalog/

詳細は、>>2以降に。
0153デフォルトの名無しさんNGNG
RDBに、ツリー構造のデータを放り込む良い方法ないですか。
子が親へのポインタ持ってるだけだと、上から降りて検索するのが
SQLの繰り返し発行になってしまって非常に遅くて困るんですが。
0154デフォルトの名無しさんNGNG
ツリー1個に ID つけて
その ツリーID もってるレコード全部取り出したら
0155デフォルトの名無しさんNGNG
>>154
全部というわけではなくて、特定ノード以下だけ選択したかったり…
ID工夫するしかないかな?あるいは、親ノードIDと子ノードIDの対応表
だけ別に作るか…アタマイテ。
0156デフォルトの名無しさんNGNG
>>155
汚い手ですが、ツリー上のノードを示す「パス」をカラムとして
持てばいいのでは。
正規化とは反対の方向になりますがね。
0157デフォルトの名無しさんNGNG
>>152
複数のセッション使えばいいんじゃない?
0158デフォルトの名無しさんNGNG
JDO実装一覧

* Exadel JDO (Riflexo) http://www.exadel.com
* FastObject (Versant) http://www.fastobjects.com
* FrontierSuite (ObjectFrontier) http://www.objectfrontier.com
* IntelliBO (Signsoft) http://www.intellibo.com
* JDO Toolkit (MVCSoft) http://www.mvcsoft.com
* JDOGenie (Versant) http://www.jdogenie.com
* JPOX http://www.jpox.org
* JRelay (Object Industries) http://www.objectindustries.com
* Kodo JDO (SolarMetric) http://www.solarmetric.com
* Lido (LIBeLIS) http://www.libelis.com
* ObjectDB (ObjectDB Software) http://www.objectdb.com
* ObjectStore (Progress Software) http://www.objectstore.net
* OJB (Apache) http://db.apache.org/ojb/
* Orient (Orient Technology) http://www.orientechnologies.com/
* PowerMap JDO (SCE) http://www.powermapjdo.com
* Speedo (ObjectWeb) http://speedo.objectweb.org
* TJDO http://tjdo.sourceforge.net
* XORM http://xorm.sourceforge.net
0159デフォルトの名無しさんNGNG
>>158
JDO も廃れたね〜。
0160デフォルトの名無しさんNGNG
結局なんだったのかなぁ
ORマッピングにこだわりすぎてROマッピングがやりにくかったとか?
0161デフォルトの名無しさんNGNG
>>153
「再帰SQL」でぐぐれ
今ならたいていのRDBMSで使えるだろ
0162デフォルトの名無しさんNGNG
>>161
実装してるのはDB2だけだと思ってたけど、他にもあったっけ?
0163デフォルトの名無しさんNGNG
JavaWorld9月号のCayenne特集に従ってソースコードを生成してみた。

package package1.auto;

import java.util.List;

/** Class _Actor was generated by Cayenne.
* It is probably a good idea to avoid changing this class manually,
* since it may be overwritten next time code is regenerated.
* If you need to make any customizations, please use subclass.
*/
public class _Actor extends org.objectstyle.cayenne.CayenneDataObject {

public static final String BIRTHDAY_PROPERTY = "birthday";
public static final String HOMETOWN_PROPERTY = "hometown";
public static final String NAME_PROPERTY = "name";
public static final String SEX_PROPERTY = "sex";
public static final String MOVIE_ARRAY_PROPERTY = "MovieArray";

public static final String ID_PK_COLUMN = "id";

public void setBirthday(java.util.Date birthday) {
writeProperty("birthday", birthday);
}
public java.util.Date getBirthday() {
return (java.util.Date)readProperty("birthday");
}


0164デフォルトの名無しさんNGNG
public void setHometown(String hometown) {
writeProperty("hometown", hometown);
}
public String getHometown() {
return (String)readProperty("hometown");
}


public void setName(String name) {
writeProperty("name", name);
}
public String getName() {
return (String)readProperty("name");
}


public void setSex(String sex) {
writeProperty("sex", sex);
}
public String getSex() {
return (String)readProperty("sex");
}

0165デフォルトの名無しさんNGNG

public void addToMovieArray(package1.Movie obj) {
addToManyTarget("MovieArray", obj, true);
}
public void removeFromMovieArray(package1.Movie obj) {
removeToManyTarget("MovieArray", obj, true);
}
public List getMovieArray() {
return (List)readProperty("MovieArray");
}


}
0166デフォルトの名無しさんNGNG
最新のベータ版を使っての
感想:

java.util.Listはimport文を生成しているのに
java.util.Dateと直接書いてるのが納得いかない。

同様に、package1.Mode objという書き方も納得いかない。
同じパッケージ内ならそんなもんいらんちゅーに。

_PROPERTYという名前の定数はどうにかならないのだろうか?

BIRTHDAY_PROPERTY という変数を使っているにもかかわらず"birthday"
という文字列を直に使うとはどういうことか?
0167デフォルトの名無しさんNGNG
>>166
java.sql.Date対策だろ
0168デフォルトの名無しさんNGNG
>>162

Oracleでは階層問い合わせだな。

SQL ServerではYukonから使える模様。
0169デフォルトの名無しさんNGNG
>>167
Generation Gapパターンが使われているんだし
java.sql.Date使われていないんだったらimport宣言してもええじゃん
と激しく思うんだが。
0170デフォルトの名無しさんNGNG
>>169
なんかの拍子にimport java.sql.*ってやったらエラーになるからじゃないの?
0171デフォルトの名無しさんNGNG
import使わずにフルパッケージ指定してくれればベストか。
0172デフォルトの名無しさんNGNG
>>170
いまどきimportに*を使う香具師はDQN
0173デフォルトの名無しさんNGNG
と、条件が限定されるローカルルールを押し付ける奴もDQN
0174デフォルトの名無しさんNGNG
と、自分の主観を押しつけるヤツもDQN
漏れモナー
0175デフォルトの名無しさんNGNG
iBATISは「イーバティス」と読む
http://d.hatena.ne.jp/kagamih/20040822#p4

@IT Hibernateで理解するO/Rマッピング:簡単なプログラムでO/Rマッピングを体験
http://www.atmarkit.co.jp/fjava/rensai3/ormap04/ormap04_1.html
0176デフォルトの名無しさんNGNG
俺もあいばてぃすって呼んでた。やっぱiMODEとかiMACの影響だな。
0177デフォルトの名無しさんNGNG
Hibernateでコネクションプールってどうしてる?
アプリケーションサーバーのDataSource使ってる?
HibernateからDBCP or c3p0?
MySql3.xだと、c3p0でごみセッションがのこりやがる。

DataSource使いたいけど、うまくいかね。
この辺のドキュメントってどこかに纏まってないかな。
0178デフォルトの名無しさんNGNG
WEB+DBの最新号読んだが。
SeaserDAOってどうなん?
0179デフォルトの名無しさんNGNG
>>178
> WEB+DBの最新号読んだが。
> SeaserDAOってどうなん?

君の感想は?
0180デフォルトの名無しさんNGNG
>>178
サクーシャの日記。この URL 6月ころから部分からだけど
このへんから読み進めると S2Dao の概念がよく分かる。
[はてなダイアリー - ひがやすをのここだけの話]
http://d.hatena.ne.jp/higayasuo/searchdiary?of=30&word=S2Dao

公式ドキュメント
[Seasar - DI Container with AOP -]
http://homepage3.nifty.com/seasar/s2dao.html

スレ
[国産オープンソースDIコンテナSeasar V2(S2)]
http://pc5.2ch.net/test/read.cgi/tech/1092044210/

俺的にはかなりいいとおも。DAOインタフェースだけ書けば実行できるのは
かなりうれしい。Hibernate や DBUtils のいいとこどり。
ただ、今はまだサクーシャにとっての完成系でないような気がするので
将来的に期待大。
0181デフォルトの名無しさんNGNG
>>179
そういう君の感想は?

サンプルプログラムにコメントが全然ないのが笑った。
Seasarの人たちって「美しいソース書けばコメントなんか不要」というポリシーなんだろうか。
0182デフォルトの名無しさんNGNG
>>181
あんなシンプルなソースにコメントいるか?
まー、人それぞれだけどな。
0183デフォルトの名無しさんNGNG
またドキュメント厨か(w
0184デフォルトの名無しさんNGNG
認定厨という言葉を最近知って衝撃を受けた

>>183
認定厨乙
0185178NGNG
>179
あ、ごめん。レス遅くなりました。
俺の感想としては、既存のSQLとの併用の割合がよさそう、て感じかなぁ。
後は、Hibernateみたいな自動生成ツールがどのくらい整ってるか、気になった。

>180
あんがと、これからスレとか見させてもらうわー。
0186デフォルトの名無しさんNGNG
最近Hibernate勉強しはじめたんだけど
テーブル結合するときは↓みたいにオブジェクトの配列で返すのが普通なの?
http://d.hatena.ne.jp/koichik/20040615#1087314385

自分でも組んでみたんだけど、
User、Statusのテーブルがあって
UserのフィールドにStatusを持たせてmany-to-oneに設定。
List userList = dao.find("from User u inner join u.Status Where u.Username='hoge'");
とした時にListの0番目の要素にオブジェクトの[User,Status]のオブジェクト配列が入ってる。
(UserオブジェクトのフィールドのStatusにも値入る。)

なんか使いづらそうな気がするんだけどこの使い方であってる?
普通はこんなことしない?
0187デフォルトの名無しさんNGNG
書き忘れ。
dao.findは↓synchronizerで生成した奴そのままだけど。
public java.util.List find(String query, Session s) throws HibernateException {
  return s.find(query);
}

sはnet.sf.hibernate.Sessionのインスタンスです。
0188デフォルトの名無しさんNGNG
>>186
クリテリアでとってくりゃいいんじゃない?
0189デフォルトの名無しさんNGNG
うまくいかない場合は、バクテリアも使ってみるといいぞ。
0190デフォルトの名無しさんNGNG
クリリンは鼻がない
0191デフォルトの名無しさんNGNG
>>188
dクス。調べてみます
0192デフォルトの名無しさんNGNG
>>186
つうかdao.find("from User u Where u.Username='hoge')でええんじゃないの?
0193デフォルトの名無しさんNGNG
age
0194デフォルトの名無しさんNGNG
hibernateを導入するときってtop-downとかbottom-upとかいろいろありますけど、
業務で使おうって人はどれが多いですか?
0195186NGNG
>>192
>>186の例でそれやると
UserテーブルをSelectして一行取得するごとにStatusテーブルをSelectしない?
0196デフォルトの名無しさんNGNG
>>195
many-to-oneでしょ?
適当にJOINするでしょ。
0197デフォルトの名無しさんNGNG
>>194
結局最初にDBありき。
オレテキには、そうするべきだとも思う。
0198デフォルトの名無しさんNGNG
誰に訊いても「そりゃDBありきだろ」と言われた俺
0199デフォルトの名無しさんNGNG
>>196
many-to-oneだよ。
show_sqlをtrueにしてログ見てるとUserを1レコード読み込む度に
StatusにSelect投げて対応する1レコード持ってきてるんだけど。
自動でjoinはしてくれないみたい。設定が悪いのかな?

http://d.hatena.ne.jp/koichik/20040615#1087314385
「しかしですね,SELECTが3回発行されているようです」の上にあるログ。

↑の日記でもそうなってるからそういうものかと思ったんだけど・・・。

0200デフォルトの名無しさんNGNG
また写真が増えておるな。そのサイト。
気にせずjoinしてくれてるんだけど、なんか設定が違うんかな。
0201デフォルトの名無しさんNGNG
>>177ではないんですが、私も気になる。
みんなどうしてんの?
0202デフォルトの名無しさんNGNG
>>201
つまり、DataSourceがうまく設定できない自分の無力さを悩んでいるだけだと思われるが。
俺はとくに問題なくDataSource使ってる。
0203177NGNG
>>201
では202さんに聞いてみましょう。

先生教えてください!>202

といっても何て設定して駄目だったか書かないといけませんね。
客先常駐になっちゃったから、ちょっと待っててください。

今日はJavaWorldのアンチパターンの記事を読んで、目から鱗でした。
まだまだ未熟者です。ガンガリまーす。
0204デフォルトの名無しさんNGNG
S2Dao
0205デフォルトの名無しさんNGNG
>>203
<property name="connection.datasource">java:comp/env/jdbc/test</property>
とやってるだけで、特別なことはやってないけど。
0206デフォルトの名無しさんNGNG
Hibernateの設定用GUI(Eclupseプラグイン?)で、なにかお薦めありますか?
0207デフォルトの名無しさんNGNG
設定なんか手書き。いっかい書けばいいだけだし。
0208デフォルトの名無しさんNGNG
>>207
質問に答えてない。

>>206
HibernatorもHibern8もイマイチだから、XDocletの直書きがやりやすい。


>>208
質問に答えてない。
0209デフォルトの名無しさんNGNG
>>208

>>>208
>質問に答えてない。

たしかに 208 は質問に答えてないな...
0210デフォルトの名無しさんNGNG
結局Middlegenでマッピング生成して、XDocletで調整、で十分だからな。
0211206NGNG
> 207
手書き一回ですか。なれた人はそうなんですね。
いろいろと考え直す事が多い私にはちょっと無理です。

> 208 
ワラタ。XDoclet、ちょっと調べましたが、
* @hibernate.property
*column="FIRSTNME"

って感じでメソッドの上にずらずら書くだけで自動生成
してくれるんですね。xml手書きよりはずっと楽そうです。
GUIでやるより結果的には楽なのかも。

>> 210
ttp://www.hibernate.org/102.html
なるほど。先にDBに表を定義してしまうんですね?
0212デフォルトの名無しさんNGNG
結局レスポンスに影響があるのはRDBなわけだから、RDB主体で設計するべきだと思うのだよ。
RDBのためのツールはたくさんあるし、簡単なスクリプト持ってるやつも多いだろうし。
0213デフォルトの名無しさんNGNG
>>211

まったく関係ないけど,あなたDB2のSAMPLEデータベースつかってますね?(笑)
0214206NGNG
>> 212

確かにそうですね。index張ったり,表スペースいじったりと
結局はDB側をなんとかしないとパフォーマンスでないですしね。

で、Middlegenを試していたのですが、これセットアップ
めんどくさくないですか?ANTが無いと起動もできない。。

build.xmlファイルをいじったり*.jarをコピーしたりして
なんとか動くまでになりましたけど。

>> 213

あたりです。
やっぱFIRSTNMEの微妙なつづりはDB2のSAMPLEだけの特徴かな。
0215デフォルトの名無しさんNGNG
>>214
middlegenとhbm2javaのタスク書くと、だらだら長くなりますね。
どうせXDoclet使うのだから、antは必要です。
0216デフォルトの名無しさんNGNG
なんでここでhibernate?と思ったけど、hibernateスレ無いからか。

maven使えば多少はmiddlegenの煩雑さから開放されるかも。
0217デフォルトの名無しさんNGNG
ちなみにHibernateのcriteriaは
クリテリアじゃなくてクライテリアだから。言っとく。
0218206NGNG
>> 214
もう一つだけ教えてください。

DBに表を作成
-> Middlegenで*.hbm.xmlを作成
-> hbm2javaで*.javaを作成

という流れだと思うのですが、XDocletをどこで
使うのですか?
*.javaに手で@hibernateを追加するのですか?
それとも@hibernateも自動的に作成される?
0219デフォルトの名無しさんNGNG
>>218
マッピングの調整。
最初から全部Middlegenで設定するのは不可能だし。
っていうか、Middlegenで設定するのはめんどうだから、自動生成だけして、設定はXDocletでやる。
XDocletタグは、なんかフラグ立てれば自動的に生成される。

実際には、
->Middlegenでhbm作成
->hbm2javaで*.javaを作成
->XDocletでhbmを作成
となるようにしておく。
そうしないと、テーブル追加したときがめんどくさい。
テーブル追加したときはhbm2javaで該当テーブルだけ*.javaを精製するようにする。
hbmは全部上書きされちゃうので、XDocletでもとにもどすというわけ。
0220デフォルトの名無しさんNGNG
△hbm2javaで
○hbm2javaの部分で
0221206NGNG
>> 219
即レスありがとうございます。参考になります。
やっぱり@タグは自動生成できるんですね。
0222デフォルトの名無しさんNGNG
削除フラグのあるテーブルを扱うマッピングのパターンみたいなの、どっかありますか?
0223デフォルトの名無しさんNGNG
Hibernateのキャッシュサイズってどこかで決められる?
無限に取り続けそうで怖くて使えね。
0224デフォルトの名無しさんNGNG
Hibernateって検索の仕方がいろいろありますが(HQLとかCriteriaとか)、
みなさんはどのように検索していますか?
0225デフォルトの名無しさんNGNG
CriteriaでできるところはCriteriaでやってる。
柔軟な条件の拡張がやりやすいから。
条件にあうものから10件取得しつつ、検索全件数を取得、とかがやりやすい。
Criteriaでの件数取得はパッチ当てる必要があるけど。
0226デフォルトの名無しさんNGNG
>> 225
パッチって、Hibernateにパッチを当てる必要があるという事ですか?
0227デフォルトの名無しさんNGNG
パッチ当ててもいいし、パッチが当てられたバイナリ使ってもいい。
0228デフォルトの名無しさんNGNG
EclipseプラグインでHibernatorプラグインというのがあるのだが
どうだろうか? 
0229デフォルトの名無しさんNGNG
XDocletで十分だなぁ。
0230デフォルトの名無しさんNGNG
だれも使ってないのかもしれないけど、個人的にはiBatisが一番楽だな。
とにかく簡単、明解なんで。
0231デフォルトの名無しさんNGNG
うん。おれもiBATIS好きだな。それこそまさに、SQLをそのままPOJOに
マッピングしてる感じで。
0232デフォルトの名無しさんNGNG
俺も愛用している。
BLOBとかつかえんのが困るけど、他のマッピングツールとかって対応してるのかな?
0233デフォルトの名無しさんNGNG
そんなキミらにHibernate3のカスタムSQLが素敵そうですぞ
ttp://www.theserverside.com/blogs/showblog.tss?id=Hibernate3_JDBC

字は読んでないけど、iBatisにメロメロなあなたにピッタリ、と書いてある気がする。
まだやっとテストが始まった段階でbetaも出てないけどね。Hibernate3。
0234デフォルトの名無しさんNGNG
>> 233

なるほど。HibernateでもSQL(HQLでなく)が書けるようになるんですね。
<sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert>
って感じで。

あと、ちょっとスレ違いだけどS2DAOもSQL直で書けてよさそうです。
ttp://homepage3.nifty.com/seasar/s2dao.html
0235デフォルトの名無しさんNGNG
>>234
あんま旨味ねーなぁ
0236デフォルトの名無しさんNGNG
>>235
SQL直書きの薄いラップが必要な箇所というのが部分的に必ずあって、そのためにHibernateを使うことをあきらめることになってたりするからねぇ。
0237デフォルトの名無しさんNGNG
結局、前スレかその前あたりで話題になってた
Hibernate使用時の表結合のあたりはどうなったんだ?
0238デフォルトの名無しさんNGNG
え、全然問題ないけど。
神とされてたサイトに結合の記述がまったくなかっただけ。
0239デフォルトの名無しさんNGNG
Map厨の人、なつかしいなぁ。
またこないかな。
0240デフォルトの名無しさんNGNG
hibernate.cfg.xmlでmapping resourceを指定しますが、
数が増えると大変です。
まとめてhbmファイルを指定する方法はあるんでしょうか?
0241デフォルトの名無しさんNGNG
>>238
おせーて
0242186=199NGNG
>>238
上で結合で困ってた物ですが教えてください(つД`)

from User user inner join fetch user.Status status inner join fetch user.Group group Where user.Username=?
↑みたいにfetchで全テーブル指定すれば目的のオブジェクト(User)だけ返ってくるのはわかったけど
毎回必要の無いテーブルまで全て指定しないといけないのが激しくダルいです。orz
今3つだからまだ我慢できるけど関連テーブルさらに増えたらやってられんす。
0243デフォルトの名無しさんNGNG
>>237
そんなあなたにiBatis

どんな結合であろうと、複雑なSQLであろうと完璧対応です。
insert, update, delete もトランザクションで完璧です。
0244デフォルトの名無しさんNGNG
>>241
検索すればいくらでも出ると思うけど。
hbm.xmlにmany-to-oneとか核だけ。
0245デフォルトの名無しさんNGNG
>>242
その例だったら別に from User user where user.Username=? で
全部の関連がつながった User が帰ってくると思うけど。
0246デフォルトの名無しさんNGNG
>>237
確か前スレ47ノサイトでは
Object obj1 = obj[0];
Object obj2 = obj[1];
Object obj3 = obj[2];
みたいなことしてたんだっけ?(うろ覚えだけど)
0247デフォルトの名無しさんNGNG
マッピング定義で結合してない場合の話だね。
0248デフォルトの名無しさんNGNG
>>242
S2Dao使え!
0249デフォルトの名無しさんNGNG
Criteriaでやるなら
session.createCriteria(User.class).add(Expression.eq("Username", aaa));
とかでついてくるし。
0250242NGNG
>>245
うちでfetchを指定しないでそれやると>>246に書いてあるように
[User,Status,Group]のオブジェクト配列がさらにレコード数分Listに格納されて返ってきまつ。

>>247
今many-to-oneの設定はこんな感じだけどさらに何か記述すれば自動で結合してくれるんですか?
ドキュメント見ていくつか試したけどうまくいかないのです。
User.hbm
  <many-to-one
   class="Group"
   name="group"
   not-null="true"
  >
   <column name="group" />
  </many-to-one>

>>248
それも興味はあるけどこれはこれで覚えたいんですよ。

>>249
Criteriaではうまくできたけど
ちょっとソート順とか変更したいだけとかでもソースの修正が必要になりそうでちょっと抵抗が・・・。
基本的にはHQLを外部ファイルに記述して読み込みたいと思ってます。
0251デフォルトの名無しさんNGNG
lazy loadingがわかってないとか?
0252デフォルトの名無しさんNGNG
lazy loadingについて詳しい解説キボン
■ このスレッドは過去ログ倉庫に格納されています