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以降に。
0666デフォルトの名無しさん
2005/05/24(火) 00:01:00っるせぇっつってんだよ、このババァ
0667デフォルトの名無しさん
2005/05/24(火) 00:17:52立ち会ったような気分だ
0668デフォルトの名無しさん
2005/05/24(火) 00:28:18おまえ、心が不健康だな
0669デフォルトの名無しさん
2005/05/24(火) 01:38:49すまんな、665がネタをふってくれたもんでな。
0670デフォルトの名無しさん
2005/05/24(火) 01:41:29ガンヲタが不健康ってことね。
そりゃ反論出来ません。
0671デフォルトの名無しさん
2005/05/24(火) 09:04:16まだ見てないけど、生JDBC使えるのかな?
とりいそぎdクス
0672デフォルトの名無しさん
2005/05/27(金) 14:14:42構文エラーがおきてもそのSQL文を表示するにはどうすればインでしょうか
0673デフォルトの名無しさん
2005/05/28(土) 10:57:34Hibernateでお聞きしたいことがあります。
hibernate.cfg.xmlにhibernate.propertiesの
hibernate.query.substitutions toLowercase=LOWER
みたいのを設定したい場合にはどうしたらよいでしょう?
というのもDB2を使っており、Expression#iLike()を用いた場合に
DB2にはILIKEがないので、LOWERが呼ばれてしまいます。
(しかも、このLOWERはJavaのString#toLowerCace()と動きが違うのです。)
そこで、カスタムスカラーを作成し、このスカラーをhibernate.cfg.xmlに
設定したく・・・
0674デフォルトの名無しさん
2005/05/28(土) 21:42:060675デフォルトの名無しさん
2005/05/30(月) 17:48:34折れも知りたいage
0676デフォルトの名無しさん
2005/06/01(水) 23:01:48保守とパフォーマンス
0677デフォルトの名無しさん
2005/06/04(土) 12:26:18禿げしく役に立たない気がするんだが。
仕事なんで仕方なく使ってるけど。
0678デフォルトの名無しさん
2005/06/04(土) 15:39:520679デフォルトの名無しさん
2005/06/05(日) 04:37:06止まってる理由が理由だけにしょうがないけど。
0680デフォルトの名無しさん
2005/06/05(日) 11:39:180681デフォルトの名無しさん
2005/06/05(日) 12:48:380682デフォルトの名無しさん
2005/06/05(日) 13:20:08ObjectとRDBのギャップを減らすんじゃねーのかよ。
SQLは隠すけどテーブル隠さないなら
頭隠してチンコ丸出しじゃねーか。
0683デフォルトの名無しさん
2005/06/05(日) 13:53:35欠かせないよ。
とりあえず決まりきったコーディングを一律に自動生成する
ことによってエンバグを防ごう、って感じじゃない?
0684デフォルトの名無しさん
2005/06/05(日) 13:56:42寄贈されたんだっけ? これにTorqueまで
あったら多すぎ
0685デフォルトの名無しさん
2005/06/05(日) 15:53:38チンコ重要。
0686デフォルトの名無しさん
2005/06/05(日) 16:39:35いや、ソースコード上でテーブルをモロに
意識しなきゃいけないのがダメダメってこと。
複数のテーブルから一つのオブジェクトを
作りたい場合なんかだと、Torque は全く使い物にならん。
だから仕様変更で他のテーブルの情報が必要になったとき、
JOINであっさり解決する所もTorque様のおかげで
ソースコードを相当直さなきゃならんかった。
これもTorqueの「Entityとそれにアクセスするクラスが継承関係で
ぎっちり結びついてる」、なんていう、古すぎる設計のせいだな。
使うなら他のFrameworkをお薦めする>諸氏
Hybernateもためしに使ってみたが、まぁまぁよさげ。学習コストがちと高いが。
>とりあえず決まりきったコーディングを一律に自動生成する
>ことによってエンバグを防ごう、って感じじゃない?
それはそうだろう。
が、IDEが進歩したり、テストのFrameworkを使うようになったから
コーディングスタイルの強制でエンバグを防ぐためのコード自動生成って
いうのは以前より意味が薄くなってきてる感じがする。
>>685
大事だが、プログラマとして振舞う時は隠しとけ、って事かな。
0687デフォルトの名無しさん
2005/06/05(日) 18:14:51Hibernateはアノテーションと一緒に使うのがよいですよ。
まだベータだけど期待大。
0688デフォルトの名無しさん
2005/06/05(日) 19:43:11EJB3.0もそっちの方向だよね。
なんか乱立気味だ。
ていうかクレイグがEJB3.0のスペックリードだっけ?
0689デフォルトの名無しさん
2005/06/05(日) 20:34:16クレイグはStrutsの人で、JSFのスペックリード。
0690デフォルトの名無しさん
2005/06/05(日) 20:36:21ひきこもりサンデーPGだからよう
自前のXML->SQL,JavaBeanジェネレータとか作って遊んでただ
でもよう、ひきこもってたら米がなくなってよう
こんなオリにおすすめのO/Rマップを教えてくれよう
0691デフォルトの名無しさん
2005/06/05(日) 21:02:01ごめん、クレイグはWebの人だったね。
Hibernateはグラビンだったかな。
0692デフォルトの名無しさん
2005/06/05(日) 21:03:19EJB3サイコー
0693デフォルトの名無しさん
2005/06/05(日) 22:20:37お仕事がんばれ。
0694デフォルトの名無しさん
2005/06/05(日) 23:59:36そう言われてみればそうだな・・・。
ttp://www.apache.org/foundation/martin.html
0695デフォルトの名無しさん
2005/06/07(火) 19:03:11複数テーブル間のJOINした結果を受け取るのって、
どんな形式になるんかな?
この辺ながめてみたけど、JOINは想定してない記事?
http://blog.hibernate.org/cgi-bin/blosxom.cgi/2004/08/23#customsql
http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#querysql
http://www.theserverside.com/blogs/showblog.tss?id=Hibernate3_JDBC
0696デフォルトの名無しさん
2005/06/10(金) 20:14:33現在メモリ節約の関係でiBATIS使いなんだけど、
Hibernate3に乗り換えようかと悩んでしまうよ。
横レス失礼
0697デフォルトの名無しさん
2005/06/11(土) 01:06:18SQLQueryだったら
SQLQuery q = sess.createSQLQuery(
"select {s.*}, {t.*}, {u.*} from t_sss as s join t_ttt as t join t_uuu as u");
q.addEntity("s", Sss.class);
q.addEntity("t", Ttt.class);
q.addEntity("u", Uuu.class);
とするとq.list()としたときにList<Object[]>が得られる。はず・・・。
[0]がt_sssのマッピングで[1]がt_tttのマッピングで、とか。
0698695
2005/06/13(月) 11:18:47dクス!
>とするとq.list()としたときにList<Object[]>が得られる。はず・・・。
>[0]がt_sssのマッピングで[1]がt_tttのマッピングで、とか。
ってことは、[0]に入っているt_sssのマッピングから、実際のマップされたオブジェクトの
配列だかコレクションだかを取り出してやればいいってことですかいな?
0699デフォルトの名無しさん
2005/06/20(月) 15:49:36たとえば、注文テーブルと注文詳細テーブルみたいなのがあって
1対Nの関係になってるとき
オブジェクト化するということは
注文テーブルのクラスは
class Chumon {
private List syousai; //Syousaiクラスのリスト
}
のようにコンポジット構造にするってことですよね?
注文詳細テーブルのクラスは注文テーブルのクラスありきで使用する
見たいな感じで
ここまであってるでしょうか?
0700デフォルトの名無しさん
2005/06/20(月) 15:51:470701デフォルトの名無しさん
2005/06/20(月) 16:07:06うう、すみません。
ところで、あってるということでしょうか?
とりあえず質問していきたいと思います。
私の気になっているところはどの時点で関連をばらしてしまうのか?ということです。
DAOクラスを作る場合
各テーブルごとのDAOクラスを作成していますが
そのばあい、注文のDAOは
calss ChumonDao{
public void insert(Chumon chumon);
}
注文詳細のDAOは
calss SyousaiDao{
public void insert(Syousai syousai);
}
のように作成しています。
DAOに委譲した時点で既にテーブル間の関連はなくなっているので
DAOを呼び出すビジネスロジックで関連をばらしてあげる
という感じにしました。
このやり方って間違ってますか?
0702デフォルトの名無しさん
2005/06/20(月) 16:17:05public void insert(Chumon chumon){
newChumon = chumonDao.insert(chumon);
Integer id = newChumon.getChumonId();
List syousaiList = chumon.getSyousai();
for(Iterator it=syousaiList.iterator();it.hasNext();){
Syousai syousai =(Syousai)it.next();
syousai.setChumonId(id);
syousaiDao.insert(syousai);
}
}
0703デフォルトの名無しさん
2005/06/20(月) 20:11:31O/Rマッピングにも色々あるが関連を作れるものが殆どだと思う。
んで、DB一行一オブジェクト的DTOと、domainオブジェクトは
別なものだと分けて考えた方がいいと思うよ。頭の中でそれが
混在してるとヤバい結果に繋がる。その上でトランザクションの
範囲とかをキチーリ把握して。
例えば;
>DAOに委譲した時点で既にテーブル間の関連はなくなっている
Chumonを更新完了した後でSyosaiの更新が落ちたらどうする?
0704703
2005/06/20(月) 20:18:37君がもしChumonDaoでcommitをやってるなら
君のソースは屑です。
AOPの宣言的トランザクション等を利用するなら
君のソースは使えます。
0705デフォルトの名無しさん
2005/06/28(火) 19:09:22例:
TableA:
id
creator_user_id
updater_user_id
Usertable
id
name
↑のようなテーブルがあって、TableAのcreator_user_idとupdater_user_id両方に
Usertableとのmany-to-one関係を指定したら、Hibernateの起動時に
net.sf.hibernate.MappingException: Repeated column in mapping for class sample.tablea should be mapped with insert="false" update="false" : id
↑のようなエラーが出て初期化に失敗します。
メッセージの通りinsertとupdateをfalseに指定したら動くようになったが、
(例の構成ではそうでもないが)更新ができないようではやはり少々不便なので、
何か解決法はないのでしょうか?
0706デフォルトの名無しさん
2005/06/28(火) 19:21:29設定の失敗をHibernateのせいにしないこと。
おかしいだろ。
> Repeated column
0707デフォルトの名無しさん
2005/06/28(火) 19:31:40見直したら確かにcolumnを勘違いして、対象テーブルのカラムを入れのが原因だった。
ありがとう&吊って来る。
0708デフォルトの名無しさん
2005/06/29(水) 10:23:520709デフォルトの名無しさん
2005/06/29(水) 11:21:100710デフォルトの名無しさん
2005/06/30(木) 22:52:54Tomcat上で動作させるとMappingExceptionがでるんですが、
解決方法ありませんか?
0711デフォルトの名無しさん
2005/06/30(木) 23:38:24バージョンは?
0712デフォルトの名無しさん
2005/07/07(木) 15:35:05//前処理(referenceの一部コピペ)
tx = session.beginTransaction();
BlogItem item = (BlogItem) session.load(BlogItem.class, itemid);
item.setText(text);
tx.commit();
session.close();
これでやってくれれば問題はないだが、
BlogItem item = (BlogItem) session.load(BlogItem.class, itemid);
item.setText(text);
session.flush();
session.close();
とflushだけされると、
そのコネクションにコミットされてないデータが残り、
hibernate内蔵のコネクションプーリングを使っているとそのコネクションを引き継いだ
リクエストだけほかのと違う値が帰ってくるという問題があった。
DBCPを使うととりあえずは直ったが、少々疑問が。
1、これはhibernate内蔵のコネクションプーリングのバグ?
2、hibernate的にcloseで放棄されたjdbcコネクションはプールに戻るが、
rollbackは誰が実行したのですか?
3、2でもしDBCPがやってるとしたら、これは自前で例えばcloseする前に
rollbackしたほうがいいですか?(コネクションの種類が変わると動作も変わるってのもあれなので)
0713デフォルトの名無しさん
2005/07/07(木) 15:40:56DBCP使っても結果は変わらない。
うむ・・いつ、どの層でどうrollbackさせようか・・・・
0714デフォルトの名無しさん
2005/07/12(火) 15:42:12SpringとHibernateをTomcatで、組み合わせて使っているんですが、
DAOからEntityを取得して、AさんがそのEntityの内容を変更すると、
Bさんにもその変更内容が伝わってしまうんですけど、なんでなんでしょう?
当然別のマシンからアクセスして、HttpSessionなんかも違う状況です。
詳しく書くと
ページ1
Aさん: ent1 = entDAO.getEnt1(100);
ent1.setName("hoge");
Bさん: ent1 = entDAO.getEnt1(100);
ent1.getName() // "hoge"が帰ってくる
ご存知の方、教えてくださいまし・・・
0715デフォルトの名無しさん
2005/07/12(火) 16:33:23>SpringとHibernateをTomcatで、組み合わせて使っているんですが、
問題の切り分けは出来ているのか?
取りあえず考えられる要素として、
1.Springの設定ミス。
・beanのsingleton属性を設定していない場合、Springから得られるbeanのインスタンスはアプリケーション内で共有される。
ちなみに手元にあるJavaWorld 2005/01 の Struts + Spring + Hibernateの特集ではsingleton属性はfalseに設定してあった。
2.DB関連のミス
・DBに送信されたクエリやテーブル/ビューの状態等。
3.セッションのスコープ範囲のミス
・セッションのスコープがapplicationスコープになっている等。
0716714
2005/07/12(火) 17:00:23>問題の切り分けは出来ているのか?
現状、Springと、Hibernateのどちらかとは踏んでいるけど、どちらかかは判別できていないです。
> 1.Springの設定ミス。
> ・beanのsingleton属性を設定・・・
これは、すべてのbeanタグに対してsingleton="false"に設定しています。
ただ、sesshonFactoryのLocalSessionFactoryBeanと、TransactionProxyFactoryBeanだけは、
singleton="false"に設定してしまうと、コンテナ起動時に、
「FactoryBeanは、Singleton="false"には、できません。」
と、怒られるのでやってません。
>2.DB関連のミス
うーん、これは考えづらい。DBから読んだあと、DBには更新を一度も行っていない状態で発生するので。
>3.セッションのスコープ範囲のミス
これもOKかと。セッションに埋まっている、データのインスタンスIDはAさんと、Bさんで違うので。
よろしくお願いします。
0717デフォルトの名無しさん
2005/07/12(火) 17:21:350718デフォルトの名無しさん
2005/07/12(火) 19:47:14すまぬ・・・
DBが更新されていた・・・すまん。
ただ、DB更新するコードは書いてなくいんだけど(つもり)、Entityの内容が変わると
トランザクション終了時にUpdateが走ってしまう。
うーん。そういうものでしたっけ?
0719デフォルトの名無しさん
2005/07/13(水) 01:01:34そうじゃないと、困る。
ってか、コミットしたときに永続化しないのなら怖すぎっていうかコミットにならないと思う。
0720デフォルトの名無しさん
2005/07/13(水) 09:45:55flushしたからじゃない?
0721デフォルトの名無しさん
2005/07/13(水) 12:07:18ん?ちょっと教えてください
Hibernateから取得したEntityは、sessionのSavaとか呼び出さなくても、Entityに変更が入ったら
DBの更新されちゃうんですか?
ちなみに、Springとの組み合わせなので、トランザクションの管理は、Springまかせですが
>>718
明示的にしている部分はないんだけど、auto_flashなモードとかってあります?
0722デフォルトの名無しさん
2005/07/13(水) 13:47:01flush()なんてメソッド使ったことないし
0723デフォルトの名無しさん
2005/07/13(水) 15:48:44キャッシュされた同じオブジェクトが帰ってきてるだけかと。
0724デフォルトの名無しさん
2005/07/13(水) 15:53:02勝手に最後にupdateしちゃうぞ
0725デフォルトの名無しさん
2005/07/13(水) 16:06:28そこで値が異なることを期待するほうがおかしいと思う。
0726714
2005/07/13(水) 16:39:37やっぱり最後にUpdateされるのは仕様ですか、そうですか。
あれ?ってことは、わざわざ save()とか呼ばなくてもいいってことですか?
昔、EntityBeanを使ってWebのアプリケーションを組んだときには、
EB直接編集すると、それこそトランザクションコミットした際にアップデートされてしまうので、
編集する際には、EBから、Value Object(今はDTO?)を取り出して、
編集はそのDTOに対して行って、最後にそのDTOをEBに戻して、
DBアップデートみたいなことをしてたんですけど。
Hibernateも同じ考えなんですかね?cloneして使うとか、かな?
こんな場合みなさんどうしてるんですか?できれば教えてほしいっす。
0727デフォルトの名無しさん
2005/07/13(水) 16:43:12flushしない限りは発行しないよ。
0728デフォルトの名無しさん
2005/07/14(木) 00:05:22> あれ?ってことは、わざわざ save()とか呼ばなくてもいいってことですか?
save()はSQLのINSERT相当です.
更新はHibernateセッションのflush()時に勝手にやってくれます.
> 昔、EntityBeanを使ってWebのアプリケーションを組んだときには、
略
> Hibernateも同じ考えなんですかね?cloneして使うとか、かな?
永続オブジェクトを取得したHibernateセッションを閉じてしまえば
そのオブジェクトは「Detached」な状態となり,変更してもDBには
反映されません.
それをDBに反映する際にはSession#update()を使います.
0729デフォルトの名無しさん
2005/07/14(木) 00:08:05> flushしない限りは発行しないよ。
明示的にFlushMode.NEVERにしない限り,トランザクションのコミット時などに
flush()自体が勝手にされます.
0730714
2005/07/15(金) 13:08:17大変参考になりました。
まとめ。トランザクションがある前提で・・・
1.あるセッション上でDBから取り出したEntityに変更が加わった場合、
トランザクション終了時に変更がDBに反映される。(FlushMode.AUTO)
2.Entityに対する変更をDBに適用したくない場合 -> FlushModeをNEVERにする
3.2で取り出したEntityを別のセッションでDBに反映させたい場合、Session#Update(Entity)する。
と、いうことですね。私の環境はSpringなので、上記の状況のFlushModeを適用したい場合
Springのトランザクションの設定で、
PROPARGATION_REQUIRED -> FlushMode.AUTO
PROPARGATION_REQUIRED,readOnly -> FlushMode.NEVER
と、すればOKと。
なので、Webで、表示、入力、更新確認は、readOnlyで設定(FlushMode.NEVER)。
DB更新が必要な場合は、readOnlyを指定しない(FlushMode.AUTO)、
変更の反映が必要なDetachedなEntityを更新する場合、update(ent)。
一時は真剣に、DAOから取り出すEntityは、
すべてcloneしてやろうかと思ってぞっとしてました。
あー、すっきり。ありがとうございました。助かりました。
0731デフォルトの名無しさん
2005/07/15(金) 13:29:38> すべてcloneしてやろうかと思ってぞっとしてました。
ぞっとするくらいDBに格納しない変更があるのが理解できんのだけど。
それに、同じオブジェクトが取得されてたら、DBが更新されたかされてないかにかかわらず、変更が伝播するよ?
0732714
2005/07/15(金) 14:13:17あ、意味が通じてなかったっすね。
>ぞっとするくらいDBに格納しない変更があるのが理解できんのだけど。
いえいえ、Entityに対する変更はかならず、DBに反映されて欲しいのです。
ただ、タイミングが問題で、というだけ。
入力画面->確認画面->結果画面があるとして
入力->確認でユーザの入力によってEntityは変更(確認画面表示のために)するけど
まだDBには反映させたくない。だって、ユーザが確認画面で「やめた」って、する場合もあるので。
>それに、同じオブジェクトが取得されてたら、DBが更新されたかされてないかにかかわらず、変更が伝播するよ?
うん。これは理解しているつもりなんだけど。なにか>>730の書き方変だったかしら?
0733デフォルトの名無しさん
2005/07/15(金) 14:19:14Hibernateから取ってきたものはDBの写像なので、ユーザー入力とは別に扱うべきだと思うけど。
とってきたエンティティの更新タイミングやキャッシュのされ方が気になるような設計は、あまりいい設計だとは思えない。
0734714
2005/07/15(金) 17:19:43>Hibernateから取ってきたものはDBの写像なので、ユーザー入力とは別に扱うべきだと思うけど。
>とってきたエンティティの更新タイミングやキャッシュのされ方が気になるような設計は、あまりいい設計だとは思えない。
うんうん、そのとおりなんだよね。おっしゃるとおりだと思います。
そこで、>>726の話に戻っちゃうんだけど、みなさんはどうしてるんでしょう?
HibernateのEntityの状態には2種類あって、detachな状態と、attachな状態。
detachな状態のEntityを更新しても自動的にDBには反映されないけど、
attachな状態のEntityを更新した場合には、反映されてしまう。
同じオブジェクトを操作しているにもかかわらず。
これを開発者が意識しないで、コードを書くようにするためにはどうしてます?
やっぱり、DAOからEntityを取り出す時に、DTOなりに値をコピーして取り出すんでしょうか?
Sessionから取り出す時にすぐにdetachにすることができれば簡単なんだけど。できるんかしら?
悩ますぃ。
0735デフォルトの名無しさん
2005/07/15(金) 17:39:580736デフォルトの名無しさん
2005/07/16(土) 14:19:40>>つまり、Hibernateでは、単一テーブルからデータを取ってくるだけなら複合キーでも
>>問題ないけど、リレーションを使おうとすると複合キーは使えないということなんでしょうか?
>
>そう。取ってくるだけなんて現実的にありえないから、全テーブル単一キーで設計するしかない。
>この時点でかなり萎える。。
かなり前の話ですまんす。
これって本当にできないんですか?試してみたら問題なくできているようなんですけど。
ちなみに hibernate3 使ってます。3から変わった?
複合キーをできれば避けるべきなのは同感だし、マニュアルにも避けろと書いてあるけど、
複合キーをやむなく使う場合、結局、どんな問題点があるんでしょう?
0737デフォルトの名無しさん
2005/07/16(土) 17:49:360738デフォルトの名無しさん
2005/07/17(日) 14:16:340739デフォルトの名無しさん
2005/07/17(日) 17:32:520740デフォルトの名無しさん
2005/07/17(日) 19:27:05SQLiteのような鯖を経由しないRDBで、ピュアJavaのものはありますでしょうか?
0741デフォルトの名無しさん
2005/07/17(日) 23:46:48HSQLDBやらDerbyやらCloudscapeみたいなもんか?
Derby=Cloudscapeね。
0742デフォルトの名無しさん
2005/07/18(月) 00:20:43組み込み系と呼ばれるホスティング専用のプロセスを立ち上げないDBMSです。
HSQLDBはスタンドアロンモードが組み込み用に用意されてるみたいですね。
でも3MBってのはちとでかすぎですかね。
SQLiteは242KBのDLLだから配布しやすいんですよね・・・
JNI経由でOS毎にDLL作ったほうがよいのでしょうか。
マナー違反?
0743デフォルトの名無しさん
2005/07/18(月) 01:04:17待て待て、3MBって何のサイズだ?
それ、ドキュメントやソース込みのzipファイルのサイズじゃないか?
HSQLDB1.8.0.1のhsqldb.jarは611kBだ。
それと、これ以上語りたいならこっちのスレが適切かと。
【Pure】HSQL database engine【Java】
ttp://pc8.2ch.net/test/read.cgi/db/1060970234/
0744デフォルトの名無しさん
2005/07/18(月) 13:58:25つhttp://www.ch-werner.de/javasqlite/
0745デフォルトの名無しさん
2005/07/19(火) 11:42:52セッションから切り離されたオブジェクトをDBに反映させるには、Session#update(obj);でいい?
切り離されたオブジェクトをupdateとすると、
a different object with the same identifier value was already associated with the sessson
と、怒られてしまうんですけどなんで?
hashcodeと、equalsは実装してます。
hibernateは、2.1.8です。
0746デフォルトの名無しさん
2005/07/19(火) 11:57:030747デフォルトの名無しさん
2005/07/19(火) 14:22:00よろしくお願いします。
0748デフォルトの名無しさん
2005/07/19(火) 21:01:140749デフォルトの名無しさん
2005/07/19(火) 22:34:340750デフォルトの名無しさん
2005/07/19(火) 22:54:00もうJNIで実装はされているのね。
あんがと。ネイティブで頑張る。Win/Linux以外はユーザに作らせる。
0751デフォルトの名無しさん
2005/07/20(水) 00:40:100752デフォルトの名無しさん
2005/07/20(水) 04:24:41update()に渡すオブジェクトと同じレコードにマッピングされたオブジェクトが
すでにセッションにあると例外が飛んできます
つまりupdate()するオブジェクトをfind()とかしちゃダメ
http://d.hatena.ne.jp/koichik/20040812#1092329105
0753デフォルトの名無しさん
2005/07/20(水) 09:47:56>>745の人が>>728の人と同じ人なら、>>733という意見なので、ごちゃごちゃイレギュラーなことの対応のために頭使うのはバカらしい、ということで。
0754デフォルトの名無しさん
2005/07/20(水) 11:43:24> ふつうにfindしたオブジェクトを変更してupdateしてるけど・・・
そのfindとupdateが同じセッションならupdateはムダ
>>745はセッションAでfindしたオブジェクトを変更してセッションBでupdateしようって話
そのセッションBでもfindしてるから例外になる
0755デフォルトの名無しさん
2005/07/20(水) 17:58:46>> ふつうにfindしたオブジェクトを変更してupdateしてるけど・・・
>そのfindとupdateが同じセッションならupdateはムダ
そうなのよね、同一セッション内ならFlushで更新されるからupdateは無駄なんだよね。
でも、ちまたのサンプルだと同一セッション内でもupdate呼んでる例が多い。まじめに勘違いしてた。
>>733な意見なのはよくわかるんだけど、どうやってるの?
設計段階、もしくはコーディングのルールとして開発者が「意識して」オブジェクトの内容を
変更しないように気をつけているの?
それともなにか別の仕組みとして、開発者が意識しなくても制御できるようになっているの?
誰かおせーて。
0756デフォルトの名無しさん
2005/07/20(水) 18:14:390757デフォルトの名無しさん
2005/07/20(水) 21:38:27マッピングオブジェクトへの変更は、DBの変更のために行う。
マッピングオブジェクトを変更したときにDBが変更されないように「意識して」設計したりしない。
0758デフォルトの名無しさん
2005/07/26(火) 03:50:15DAOレイヤーのオブジェクトをビジネスレイヤーより下の階層に渡すってのは
あまりやらない方が良い事なのでしょうか?
evictした後に渡すべき何でしょうか。
その辺悩んでおります。
0759デフォルトの名無しさん
2005/07/29(金) 22:26:39CastorXMLみたいなことできるか?
0760759
2005/07/30(土) 14:12:07マッピングファイルを使ってある程度自由なXMLを書き出すことができるのはCasterと一緒か。
0761デフォルトの名無しさん
2005/08/09(火) 17:07:54many-to-one関連で主キーを使ってマッピングした場合は外部制約を正しく生成してくれるが、
property-refを使ったmany-to-one関連はまったく生成してくれなくて困っています。(hbm2dllで)
何かパラメータの指定で出来るのか、
それとも元々property-refでの関連では外部キーを使わないものでしょうか?
(出来れば主キーにマッピングしたいところだが、
外部のデータと連携するために他のDBと一意のユニーク値で連結する必要があるので)
0762デフォルトの名無しさん
2005/08/15(月) 14:58:34オブジェクト生成に独自のコンテナ(といってもSpringですが)を使っている為、
オブジェクトのインスタンス化をフックしたいのですが
Interceptor.instantiateをインプリ面とすれば良いという所までは突き止めました。
しかし、この関数 id を引数に取るのですが、オブジェクトに id を設定してやらないと
エラーになってしまうようなのです。しかしながら、 Hibernateを使っている方なら
ご存知の通り、 id はHibernateの設定ファイルで自由に指定できます。
Hibernate自身の設定ファイルの設定に従ってオブジェクト id を設定するような
インターフェースは無いものでしょうか。
0763762
2005/08/15(月) 15:36:44マニュアルにしっかりのってました。。
SessionFactory#getClassMetadata
0764デフォルトの名無しさん
2005/08/18(木) 19:36:33timestampにはoptimisticロックの「安全性の低い実装」とあるから、使うのをとてつもなく躊躇する。
じゃぁ、安全性の高い実装は何なの?と思ったり。
versionもトランザクションが長い場合に使うとあるのだが、自動的にインクリメントされるの?
ロックの競合を防ぐために使われるもの?説明が足りなくてこまるなぁ。
使ったことある人、どういう用途で使ってるのか、実用的かを教えてクリクリトリス
0765デフォルトの名無しさん
2005/08/19(金) 00:50:48されるわけだ。
具体的にはユーザAがある列をSELECTする(VERSION=0)。ほかのユーザBが同じ列をSELECTする(VERSION=0)
で、ユーザBがなにか変更してUPDATEをおこなう。このときVERSIONは1になる。さらにユーザAも何か変更
してUPDATEしようとする。しかし、自分の知っているVERSIONより新しくなっているので更新できずに例外
が発生する、というわけだ。
まぁ、WEBアプリなんかではありがちな手法だと思うが。便利かどうかはシステムの仕様次第じゃないか。
ちなみに間違ってても責任とれんので実験してみてくれ。
■ このスレッドは過去ログ倉庫に格納されています