Java⇔RDBのMapping-Frameworkを語るThre Vol.3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG「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子が親へのポインタ持ってるだけだと、上から降りて検索するのが
SQLの繰り返し発行になってしまって非常に遅くて困るんですが。
0154デフォルトの名無しさん
NGNGその ツリーID もってるレコード全部取り出したら
0155デフォルトの名無しさん
NGNG全部というわけではなくて、特定ノード以下だけ選択したかったり…
ID工夫するしかないかな?あるいは、親ノードIDと子ノードIDの対応表
だけ別に作るか…アタマイテ。
0156デフォルトの名無しさん
NGNG汚い手ですが、ツリー上のノードを示す「パス」をカラムとして
持てばいいのでは。
正規化とは反対の方向になりますがね。
0157デフォルトの名無しさん
NGNG複数のセッション使えばいいんじゃない?
0158デフォルトの名無しさん
NGNG* 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デフォルトの名無しさん
NGNGJDO も廃れたね〜。
0160デフォルトの名無しさん
NGNGORマッピングにこだわりすぎてROマッピングがやりにくかったとか?
0161デフォルトの名無しさん
NGNG「再帰SQL」でぐぐれ
今ならたいていのRDBMSで使えるだろ
0162デフォルトの名無しさん
NGNG実装してるのはDB2だけだと思ってたけど、他にもあったっけ?
0163デフォルトの名無しさん
NGNGpackage 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デフォルトの名無しさん
NGNGwriteProperty("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デフォルトの名無しさん
NGNGpublic 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デフォルトの名無しさん
NGNGjava.sql.Date対策だろ
0168デフォルトの名無しさん
NGNGOracleでは階層問い合わせだな。
SQL ServerではYukonから使える模様。
0169デフォルトの名無しさん
NGNGGeneration Gapパターンが使われているんだし
java.sql.Date使われていないんだったらimport宣言してもええじゃん
と激しく思うんだが。
0170デフォルトの名無しさん
NGNGなんかの拍子にimport java.sql.*ってやったらエラーになるからじゃないの?
0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNGいまどきimportに*を使う香具師はDQN
0173デフォルトの名無しさん
NGNG0174デフォルトの名無しさん
NGNG漏れモナー
0175デフォルトの名無しさん
NGNGhttp://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デフォルトの名無しさん
NGNG0177デフォルトの名無しさん
NGNGアプリケーションサーバーのDataSource使ってる?
HibernateからDBCP or c3p0?
MySql3.xだと、c3p0でごみセッションがのこりやがる。
DataSource使いたいけど、うまくいかね。
この辺のドキュメントってどこかに纏まってないかな。
0178デフォルトの名無しさん
NGNGSeaserDAOってどうなん?
0179デフォルトの名無しさん
NGNG> WEB+DBの最新号読んだが。
> SeaserDAOってどうなん?
君の感想は?
0180デフォルトの名無しさん
NGNGサクーシャの日記。この 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そういう君の感想は?
サンプルプログラムにコメントが全然ないのが笑った。
Seasarの人たちって「美しいソース書けばコメントなんか不要」というポリシーなんだろうか。
0182デフォルトの名無しさん
NGNGあんなシンプルなソースにコメントいるか?
まー、人それぞれだけどな。
0183デフォルトの名無しさん
NGNG0184デフォルトの名無しさん
NGNG>>183
認定厨乙
0185178
NGNGあ、ごめん。レス遅くなりました。
俺の感想としては、既存のSQLとの併用の割合がよさそう、て感じかなぁ。
後は、Hibernateみたいな自動生成ツールがどのくらい整ってるか、気になった。
>180
あんがと、これからスレとか見させてもらうわー。
0186デフォルトの名無しさん
NGNGテーブル結合するときは↓みたいにオブジェクトの配列で返すのが普通なの?
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デフォルトの名無しさん
NGNGdao.findは↓synchronizerで生成した奴そのままだけど。
public java.util.List find(String query, Session s) throws HibernateException {
return s.find(query);
}
sはnet.sf.hibernate.Sessionのインスタンスです。
0188デフォルトの名無しさん
NGNGクリテリアでとってくりゃいいんじゃない?
0189デフォルトの名無しさん
NGNG0190デフォルトの名無しさん
NGNG0191デフォルトの名無しさん
NGNGdクス。調べてみます
0192デフォルトの名無しさん
NGNGつうかdao.find("from User u Where u.Username='hoge')でええんじゃないの?
0193デフォルトの名無しさん
NGNG0194デフォルトの名無しさん
NGNG業務で使おうって人はどれが多いですか?
0196デフォルトの名無しさん
NGNGmany-to-oneでしょ?
適当にJOINするでしょ。
0197デフォルトの名無しさん
NGNG結局最初にDBありき。
オレテキには、そうするべきだとも思う。
0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNGmany-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みんなどうしてんの?
0202デフォルトの名無しさん
NGNGつまり、DataSourceがうまく設定できない自分の無力さを悩んでいるだけだと思われるが。
俺はとくに問題なくDataSource使ってる。
0203177
NGNGでは202さんに聞いてみましょう。
先生教えてください!>202
といっても何て設定して駄目だったか書かないといけませんね。
客先常駐になっちゃったから、ちょっと待っててください。
今日はJavaWorldのアンチパターンの記事を読んで、目から鱗でした。
まだまだ未熟者です。ガンガリまーす。
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNG<property name="connection.datasource">java:comp/env/jdbc/test</property>
とやってるだけで、特別なことはやってないけど。
0206デフォルトの名無しさん
NGNG0207デフォルトの名無しさん
NGNG0208デフォルトの名無しさん
NGNG質問に答えてない。
>>206
HibernatorもHibern8もイマイチだから、XDocletの直書きがやりやすい。
>>208
質問に答えてない。
0209デフォルトの名無しさん
NGNG>>>208
>質問に答えてない。
たしかに 208 は質問に答えてないな...
0210デフォルトの名無しさん
NGNG0211206
NGNG手書き一回ですか。なれた人はそうなんですね。
いろいろと考え直す事が多い私にはちょっと無理です。
> 208
ワラタ。XDoclet、ちょっと調べましたが、
* @hibernate.property
*column="FIRSTNME"
って感じでメソッドの上にずらずら書くだけで自動生成
してくれるんですね。xml手書きよりはずっと楽そうです。
GUIでやるより結果的には楽なのかも。
>> 210
ttp://www.hibernate.org/102.html
なるほど。先にDBに表を定義してしまうんですね?
0212デフォルトの名無しさん
NGNGRDBのためのツールはたくさんあるし、簡単なスクリプト持ってるやつも多いだろうし。
0213デフォルトの名無しさん
NGNGまったく関係ないけど,あなたDB2のSAMPLEデータベースつかってますね?(笑)
0214206
NGNG確かにそうですね。index張ったり,表スペースいじったりと
結局はDB側をなんとかしないとパフォーマンスでないですしね。
で、Middlegenを試していたのですが、これセットアップ
めんどくさくないですか?ANTが無いと起動もできない。。
build.xmlファイルをいじったり*.jarをコピーしたりして
なんとか動くまでになりましたけど。
>> 213
あたりです。
やっぱFIRSTNMEの微妙なつづりはDB2のSAMPLEだけの特徴かな。
0215デフォルトの名無しさん
NGNGmiddlegenとhbm2javaのタスク書くと、だらだら長くなりますね。
どうせXDoclet使うのだから、antは必要です。
0216デフォルトの名無しさん
NGNGmaven使えば多少はmiddlegenの煩雑さから開放されるかも。
0217デフォルトの名無しさん
NGNGクリテリアじゃなくてクライテリアだから。言っとく。
0218206
NGNGもう一つだけ教えてください。
DBに表を作成
-> Middlegenで*.hbm.xmlを作成
-> hbm2javaで*.javaを作成
という流れだと思うのですが、XDocletをどこで
使うのですか?
*.javaに手で@hibernateを追加するのですか?
それとも@hibernateも自動的に作成される?
0219デフォルトの名無しさん
NGNGマッピングの調整。
最初から全部Middlegenで設定するのは不可能だし。
っていうか、Middlegenで設定するのはめんどうだから、自動生成だけして、設定はXDocletでやる。
XDocletタグは、なんかフラグ立てれば自動的に生成される。
実際には、
->Middlegenでhbm作成
->hbm2javaで*.javaを作成
->XDocletでhbmを作成
となるようにしておく。
そうしないと、テーブル追加したときがめんどくさい。
テーブル追加したときはhbm2javaで該当テーブルだけ*.javaを精製するようにする。
hbmは全部上書きされちゃうので、XDocletでもとにもどすというわけ。
0220デフォルトの名無しさん
NGNG○hbm2javaの部分で
0221206
NGNG即レスありがとうございます。参考になります。
やっぱり@タグは自動生成できるんですね。
0222デフォルトの名無しさん
NGNG0223デフォルトの名無しさん
NGNG無限に取り続けそうで怖くて使えね。
0224デフォルトの名無しさん
NGNGみなさんはどのように検索していますか?
0225デフォルトの名無しさん
NGNG柔軟な条件の拡張がやりやすいから。
条件にあうものから10件取得しつつ、検索全件数を取得、とかがやりやすい。
Criteriaでの件数取得はパッチ当てる必要があるけど。
0226デフォルトの名無しさん
NGNGパッチって、Hibernateにパッチを当てる必要があるという事ですか?
0227デフォルトの名無しさん
NGNG0228デフォルトの名無しさん
NGNGどうだろうか?
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNGとにかく簡単、明解なんで。
0231デフォルトの名無しさん
NGNGマッピングしてる感じで。
0232デフォルトの名無しさん
NGNGBLOBとかつかえんのが困るけど、他のマッピングツールとかって対応してるのかな?
0233デフォルトの名無しさん
NGNGttp://www.theserverside.com/blogs/showblog.tss?id=Hibernate3_JDBC
字は読んでないけど、iBatisにメロメロなあなたにピッタリ、と書いてある気がする。
まだやっとテストが始まった段階でbetaも出てないけどね。Hibernate3。
0234デフォルトの名無しさん
NGNGなるほど。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あんま旨味ねーなぁ
0236デフォルトの名無しさん
NGNGSQL直書きの薄いラップが必要な箇所というのが部分的に必ずあって、そのためにHibernateを使うことをあきらめることになってたりするからねぇ。
0237デフォルトの名無しさん
NGNGHibernate使用時の表結合のあたりはどうなったんだ?
0238デフォルトの名無しさん
NGNG神とされてたサイトに結合の記述がまったくなかっただけ。
0239デフォルトの名無しさん
NGNGまたこないかな。
0240デフォルトの名無しさん
NGNG数が増えると大変です。
まとめてhbmファイルを指定する方法はあるんでしょうか?
0241デフォルトの名無しさん
NGNGおせーて
0242186=199
NGNG上で結合で困ってた物ですが教えてください(つД`)
from User user inner join fetch user.Status status inner join fetch user.Group group Where user.Username=?
↑みたいにfetchで全テーブル指定すれば目的のオブジェクト(User)だけ返ってくるのはわかったけど
毎回必要の無いテーブルまで全て指定しないといけないのが激しくダルいです。orz
今3つだからまだ我慢できるけど関連テーブルさらに増えたらやってられんす。
0243デフォルトの名無しさん
NGNGそんなあなたにiBatis
どんな結合であろうと、複雑なSQLであろうと完璧対応です。
insert, update, delete もトランザクションで完璧です。
0244デフォルトの名無しさん
NGNG検索すればいくらでも出ると思うけど。
hbm.xmlにmany-to-oneとか核だけ。
0245デフォルトの名無しさん
NGNGその例だったら別に from User user where user.Username=? で
全部の関連がつながった User が帰ってくると思うけど。
0246デフォルトの名無しさん
NGNG確か前スレ47ノサイトでは
Object obj1 = obj[0];
Object obj2 = obj[1];
Object obj3 = obj[2];
みたいなことしてたんだっけ?(うろ覚えだけど)
0247デフォルトの名無しさん
NGNG0248デフォルトの名無しさん
NGNGS2Dao使え!
0249デフォルトの名無しさん
NGNGsession.createCriteria(User.class).add(Expression.eq("Username", aaa));
とかでついてくるし。
0250242
NGNGうちで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デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています