トップページ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以降に。
0666デフォルトの名無しさん2005/05/24(火) 00:01:00
>>665
っるせぇっつってんだよ、このババァ
0667デフォルトの名無しさん2005/05/24(火) 00:17:52
なんか過去に戻って歴史を変えてしまった瞬間に
立ち会ったような気分だ
0668デフォルトの名無しさん2005/05/24(火) 00:28:18
いみふめ。
おまえ、心が不健康だな
0669デフォルトの名無しさん2005/05/24(火) 01:38:49
>>668
すまんな、665がネタをふってくれたもんでな。
0670デフォルトの名無しさん2005/05/24(火) 01:41:29
あーそうか。
ガンヲタが不健康ってことね。
そりゃ反論出来ません。
0671デフォルトの名無しさん2005/05/24(火) 09:04:16
>>664
まだ見てないけど、生JDBC使えるのかな?
とりいそぎdクス
0672デフォルトの名無しさん2005/05/27(金) 14:14:42
iBATISの実行SQL文のログ出力で
構文エラーがおきてもそのSQL文を表示するにはどうすればインでしょうか
0673デフォルトの名無しさん2005/05/28(土) 10:57:34
いきなりすみません。
Hibernateでお聞きしたいことがあります。
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:06
死んだか...
0675デフォルトの名無しさん2005/05/30(月) 17:48:34
>>372
折れも知りたいage
0676デフォルトの名無しさん2005/06/01(水) 23:01:48
正規化と多様性
保守とパフォーマンス
0677デフォルトの名無しさん2005/06/04(土) 12:26:18
Torqueって使ってる人いる?
禿げしく役に立たない気がするんだが。
仕事なんで仕方なく使ってるけど。
0678デフォルトの名無しさん2005/06/04(土) 15:39:52
かわいそうに・・・
0679デフォルトの名無しさん2005/06/05(日) 04:37:06
一時期けっこう話題になったが開発止まってるからな・・・。
止まってる理由が理由だけにしょうがないけど。
0680デフォルトの名無しさん2005/06/05(日) 11:39:18
理由って何?
0681デフォルトの名無しさん2005/06/05(日) 12:48:38
開発者が亡くなったらしい
0682デフォルトの名無しさん2005/06/05(日) 13:20:08
つーか、そもそも存在意義がわからん。>Torque
ObjectとRDBのギャップを減らすんじゃねーのかよ。
SQLは隠すけどテーブル隠さないなら
頭隠してチンコ丸出しじゃねーか。
0683デフォルトの名無しさん2005/06/05(日) 13:53:35
ORマッピングツールである以上、テーブルの情報は
欠かせないよ。

とりあえず決まりきったコーディングを一律に自動生成する
ことによってエンバグを防ごう、って感じじゃない?
0684デフォルトの名無しさん2005/06/05(日) 13:56:42
アパッチはOJBってのもかかえてるし、iBATISも
寄贈されたんだっけ? これにTorqueまで
あったら多すぎ
0685デフォルトの名無しさん2005/06/05(日) 15:53:38
>>682
チンコ重要。
0686デフォルトの名無しさん2005/06/05(日) 16:39:35
>>683
いや、ソースコード上でテーブルをモロに
意識しなきゃいけないのがダメダメってこと。
複数のテーブルから一つのオブジェクトを
作りたい場合なんかだと、Torque は全く使い物にならん。
だから仕様変更で他のテーブルの情報が必要になったとき、
JOINであっさり解決する所もTorque様のおかげで
ソースコードを相当直さなきゃならんかった。

これもTorqueの「Entityとそれにアクセスするクラスが継承関係で
ぎっちり結びついてる」、なんていう、古すぎる設計のせいだな。

使うなら他のFrameworkをお薦めする>諸氏
Hybernateもためしに使ってみたが、まぁまぁよさげ。学習コストがちと高いが。

>とりあえず決まりきったコーディングを一律に自動生成する
>ことによってエンバグを防ごう、って感じじゃない?
それはそうだろう。
が、IDEが進歩したり、テストのFrameworkを使うようになったから
コーディングスタイルの強制でエンバグを防ぐためのコード自動生成って
いうのは以前より意味が薄くなってきてる感じがする。

>>685
大事だが、プログラマとして振舞う時は隠しとけ、って事かな。
0687デフォルトの名無しさん2005/06/05(日) 18:14:51
>>686
Hibernateはアノテーションと一緒に使うのがよいですよ。
まだベータだけど期待大。
0688デフォルトの名無しさん2005/06/05(日) 19:43:11
>>687
EJB3.0もそっちの方向だよね。
なんか乱立気味だ。

ていうかクレイグがEJB3.0のスペックリードだっけ?
0689デフォルトの名無しさん2005/06/05(日) 20:34:16
Hibernateのアノテーションは、EJB3と共通だよ。
クレイグはStrutsの人で、JSFのスペックリード。
0690デフォルトの名無しさん2005/06/05(日) 20:36:21
オリはよう
ひきこもりサンデーPGだからよう
自前のXML->SQL,JavaBeanジェネレータとか作って遊んでただ
でもよう、ひきこもってたら米がなくなってよう
こんなオリにおすすめのO/Rマップを教えてくれよう
0691デフォルトの名無しさん2005/06/05(日) 21:02:01
>>689
ごめん、クレイグはWebの人だったね。
Hibernateはグラビンだったかな。
0692デフォルトの名無しさん2005/06/05(日) 21:03:19
>>690
EJB3サイコー
0693デフォルトの名無しさん2005/06/05(日) 22:20:37
>>234
お仕事がんばれ。
0694デフォルトの名無しさん2005/06/05(日) 23:59:36
>>681
そう言われてみればそうだな・・・。
ttp://www.apache.org/foundation/martin.html
0695デフォルトの名無しさん2005/06/07(火) 19:03:11
Hibernate3で、Native-SQL投げるときに(iBATISみたいに使いたいと)、
複数テーブル間の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
うわぁ、>>695のリンク先見たけどiBATISクリソツ・・・
現在メモリ節約の関係でiBATIS使いなんだけど、
Hibernate3に乗り換えようかと悩んでしまうよ。

横レス失礼
0697デフォルトの名無しさん2005/06/11(土) 01:06:18
>>695
SQLQueryだったら
 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のマッピングで、とか。
06986952005/06/13(月) 11:18:47
>>697
dクス!

>とするとq.list()としたときにList<Object[]>が得られる。はず・・・。
>[0]がt_sssのマッピングで[1]がt_tttのマッピングで、とか。

ってことは、[0]に入っているt_sssのマッピングから、実際のマップされたオブジェクトの
配列だかコレクションだかを取り出してやればいいってことですかいな?
0699デフォルトの名無しさん2005/06/20(月) 15:49:36
ORマッピングってテーブル間の関連もオブジェクト化するんですよか?

たとえば、注文テーブルと注文詳細テーブルみたいなのがあって
1対Nの関係になってるとき
オブジェクト化するということは
注文テーブルのクラスは
class Chumon {
  private List syousai; //Syousaiクラスのリスト

}
のようにコンポジット構造にするってことですよね?
注文詳細テーブルのクラスは注文テーブルのクラスありきで使用する
見たいな感じで

ここまであってるでしょうか?
0700デフォルトの名無しさん2005/06/20(月) 15:51:47
するんですよ。
0701デフォルトの名無しさん2005/06/20(月) 16:07:06
>>700
うう、すみません。
ところで、あってるということでしょうか?
とりあえず質問していきたいと思います。

私の気になっているところはどの時点で関連をばらしてしまうのか?ということです。
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:05
ビジネスロジックのソースはこんな感じです

public 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:31
>>701
O/Rマッピングにも色々あるが関連を作れるものが殆どだと思う。

んで、DB一行一オブジェクト的DTOと、domainオブジェクトは
別なものだと分けて考えた方がいいと思うよ。頭の中でそれが
混在してるとヤバい結果に繋がる。その上でトランザクションの
範囲とかをキチーリ把握して。

例えば;
>DAOに委譲した時点で既にテーブル間の関連はなくなっている
Chumonを更新完了した後でSyosaiの更新が落ちたらどうする?
07047032005/06/20(月) 20:18:37
補足:

君がもしChumonDaoでcommitをやってるなら
君のソースは屑です。

AOPの宣言的トランザクション等を利用するなら
君のソースは使えます。
0705デフォルトの名無しさん2005/06/28(火) 19:09:22
Hibernateのmany-to-oneマッピングについてちょっと質問
例:
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
>>705
設定の失敗をHibernateのせいにしないこと。
おかしいだろ。
> Repeated column
0707デフォルトの名無しさん2005/06/28(火) 19:31:40
はやっw
見直したら確かにcolumnを勘違いして、対象テーブルのカラムを入れのが原因だった。
ありがとう&吊って来る。
0708デフォルトの名無しさん2005/06/29(水) 10:23:52
何を何で吊るというのか?
0709デフォルトの名無しさん2005/06/29(水) 11:21:10
回線でお前の首を。
0710デフォルトの名無しさん2005/06/30(木) 22:52:54
Hibernateを使用したWebアプリをスタンドアロンのPCで
Tomcat上で動作させるとMappingExceptionがでるんですが、
解決方法ありませんか?
0711デフォルトの名無しさん2005/06/30(木) 23:38:24
>>710
バージョンは?
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:56
すいません、↑だがテストのミスでした。
DBCP使っても結果は変わらない。
うむ・・いつ、どの層でどうrollbackさせようか・・・・
0714デフォルトの名無しさん2005/07/12(火) 15:42:12
すみませんが教えてください。
Springと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
>>714
>SpringとHibernateをTomcatで、組み合わせて使っているんですが、 
問題の切り分けは出来ているのか?

取りあえず考えられる要素として、
1.Springの設定ミス。
 ・beanのsingleton属性を設定していない場合、Springから得られるbeanのインスタンスはアプリケーション内で共有される。
 ちなみに手元にあるJavaWorld 2005/01 の Struts + Spring + Hibernateの特集ではsingleton属性はfalseに設定してあった。

2.DB関連のミス
 ・DBに送信されたクエリやテーブル/ビューの状態等。

3.セッションのスコープ範囲のミス
 ・セッションのスコープがapplicationスコープになっている等。
07167142005/07/12(火) 17:00:23
>>715 レスありがとう。

>問題の切り分けは出来ているのか?
現状、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:35
本当にDBは更新されてないのか?
0718デフォルトの名無しさん2005/07/12(火) 19:47:14
>>717
すまぬ・・・
DBが更新されていた・・・すまん。
ただ、DB更新するコードは書いてなくいんだけど(つもり)、Entityの内容が変わると
トランザクション終了時にUpdateが走ってしまう。
うーん。そういうものでしたっけ?
0719デフォルトの名無しさん2005/07/13(水) 01:01:34
DBが更新されてなくても、コミットしたならキャッシュにも反映される。
そうじゃないと、困る。
ってか、コミットしたときに永続化しないのなら怖すぎっていうかコミットにならないと思う。
0720デフォルトの名無しさん2005/07/13(水) 09:45:55
>718
flushしたからじゃない?
0721デフォルトの名無しさん2005/07/13(水) 12:07:18
>>719
ん?ちょっと教えてください

Hibernateから取得したEntityは、sessionのSavaとか呼び出さなくても、Entityに変更が入ったら
DBの更新されちゃうんですか?
ちなみに、Springとの組み合わせなので、トランザクションの管理は、Springまかせですが

>>718
明示的にしている部分はないんだけど、auto_flashなモードとかってあります?
0722デフォルトの名無しさん2005/07/13(水) 13:47:01
デフォルトでcloseするときにSQL発行するんでなかろーか
flush()なんてメソッド使ったことないし
0723デフォルトの名無しさん2005/07/13(水) 15:48:44
>>714
キャッシュされた同じオブジェクトが帰ってきてるだけかと。
0724デフォルトの名無しさん2005/07/13(水) 15:53:02
Hibernateは取得したオブジェクト変更したら
勝手に最後にupdateしちゃうぞ
0725デフォルトの名無しさん2005/07/13(水) 16:06:28
ま、理由はどうあれ、>>714はただしい動作だな。
そこで値が異なることを期待するほうがおかしいと思う。
07267142005/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:12
>724
flushしない限りは発行しないよ。
0728デフォルトの名無しさん2005/07/14(木) 00:05:22
>>726
> あれ?ってことは、わざわざ save()とか呼ばなくてもいいってことですか?
save()はSQLのINSERT相当です.
更新はHibernateセッションのflush()時に勝手にやってくれます.

> 昔、EntityBeanを使ってWebのアプリケーションを組んだときには、

> Hibernateも同じ考えなんですかね?cloneして使うとか、かな?
永続オブジェクトを取得したHibernateセッションを閉じてしまえば
そのオブジェクトは「Detached」な状態となり,変更してもDBには
反映されません.
それをDBに反映する際にはSession#update()を使います.
0729デフォルトの名無しさん2005/07/14(木) 00:08:05
>>727
> flushしない限りは発行しないよ。
明示的にFlushMode.NEVERにしない限り,トランザクションのコミット時などに
flush()自体が勝手にされます.
07307142005/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
> 一時は真剣に、DAOから取り出すEntityは、
> すべてcloneしてやろうかと思ってぞっとしてました。

ぞっとするくらいDBに格納しない変更があるのが理解できんのだけど。
それに、同じオブジェクトが取得されてたら、DBが更新されたかされてないかにかかわらず、変更が伝播するよ?
07327142005/07/15(金) 14:13:17
>>731
あ、意味が通じてなかったっすね。

>ぞっとするくらいDBに格納しない変更があるのが理解できんのだけど。
いえいえ、Entityに対する変更はかならず、DBに反映されて欲しいのです。
ただ、タイミングが問題で、というだけ。

入力画面->確認画面->結果画面があるとして

入力->確認でユーザの入力によってEntityは変更(確認画面表示のために)するけど
まだDBには反映させたくない。だって、ユーザが確認画面で「やめた」って、する場合もあるので。

>それに、同じオブジェクトが取得されてたら、DBが更新されたかされてないかにかかわらず、変更が伝播するよ?
うん。これは理解しているつもりなんだけど。なにか>>730の書き方変だったかしら?
0733デフォルトの名無しさん2005/07/15(金) 14:19:14
>>732
Hibernateから取ってきたものはDBの写像なので、ユーザー入力とは別に扱うべきだと思うけど。
とってきたエンティティの更新タイミングやキャッシュのされ方が気になるような設計は、あまりいい設計だとは思えない。
07347142005/07/15(金) 17:19:43
>>733
>Hibernateから取ってきたものはDBの写像なので、ユーザー入力とは別に扱うべきだと思うけど。
>とってきたエンティティの更新タイミングやキャッシュのされ方が気になるような設計は、あまりいい設計だとは思えない。
うんうん、そのとおりなんだよね。おっしゃるとおりだと思います。

そこで、>>726の話に戻っちゃうんだけど、みなさんはどうしてるんでしょう?
HibernateのEntityの状態には2種類あって、detachな状態と、attachな状態。
detachな状態のEntityを更新しても自動的にDBには反映されないけど、
attachな状態のEntityを更新した場合には、反映されてしまう。
同じオブジェクトを操作しているにもかかわらず。

これを開発者が意識しないで、コードを書くようにするためにはどうしてます?
やっぱり、DAOからEntityを取り出す時に、DTOなりに値をコピーして取り出すんでしょうか?
Sessionから取り出す時にすぐにdetachにすることができれば簡単なんだけど。できるんかしら?

悩ますぃ。
0735デフォルトの名無しさん2005/07/15(金) 17:39:58
Session#evict()
0736デフォルトの名無しさん2005/07/16(土) 14:19:40
> >574
>>つまり、Hibernateでは、単一テーブルからデータを取ってくるだけなら複合キーでも
>>問題ないけど、リレーションを使おうとすると複合キーは使えないということなんでしょうか?
>
>そう。取ってくるだけなんて現実的にありえないから、全テーブル単一キーで設計するしかない。
>この時点でかなり萎える。。

かなり前の話ですまんす。
これって本当にできないんですか?試してみたら問題なくできているようなんですけど。
ちなみに hibernate3 使ってます。3から変わった?

複合キーをできれば避けるべきなのは同感だし、マニュアルにも避けろと書いてあるけど、
複合キーをやむなく使う場合、結局、どんな問題点があるんでしょう?
0737デフォルトの名無しさん2005/07/16(土) 17:49:36
結局勘違いだったっていう結末だったと思うんだけど。
0738デフォルトの名無しさん2005/07/17(日) 14:16:34
素直にSQLバリバリ書いたほうがトータルコストは安いというのが結論?
0739デフォルトの名無しさん2005/07/17(日) 17:32:52
ぜんぜん。
0740デフォルトの名無しさん2005/07/17(日) 19:27:05
微妙にスレ違いになってしまうかも知れませんが
SQLiteのような鯖を経由しないRDBで、ピュアJavaのものはありますでしょうか?
0741デフォルトの名無しさん2005/07/17(日) 23:46:48
鯖を経由しないってのがどんなもんかしらんが。
HSQLDBやらDerbyやらCloudscapeみたいなもんか?
Derby=Cloudscapeね。
0742デフォルトの名無しさん2005/07/18(月) 00:20:43
>>741
組み込み系と呼ばれるホスティング専用のプロセスを立ち上げないDBMSです。
HSQLDBはスタンドアロンモードが組み込み用に用意されてるみたいですね。
でも3MBってのはちとでかすぎですかね。

SQLiteは242KBのDLLだから配布しやすいんですよね・・・
JNI経由でOS毎にDLL作ったほうがよいのでしょうか。
マナー違反?
0743デフォルトの名無しさん2005/07/18(月) 01:04:17
>>742
待て待て、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
>>742
http://www.ch-werner.de/javasqlite/
0745デフォルトの名無しさん2005/07/19(火) 11:42:52
>>728にもありましたが

セッションから切り離されたオブジェクトを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:03
書いてある通りだと思うんだが
0747デフォルトの名無しさん2005/07/19(火) 14:22:00
>>746さん、どうやって解消したらよいかご存知でしたら教えてもらえませんでしょうか?
よろしくお願いします。
0748デフォルトの名無しさん2005/07/19(火) 21:01:14
答えようかと思ったのだが、おれは746ではないし。
0749デフォルトの名無しさん2005/07/19(火) 22:34:34
>>748はハゲ
0750デフォルトの名無しさん2005/07/19(火) 22:54:00
>>744
もうJNIで実装はされているのね。
あんがと。ネイティブで頑張る。Win/Linux以外はユーザに作らせる。
0751デフォルトの名無しさん2005/07/20(水) 00:40:10
>>748さん、>>746さんそれ以外の方々もご存知でしたら何卒ご教授願いますようよろしくお願いいたします。
0752デフォルトの名無しさん2005/07/20(水) 04:24:41
>>751
update()に渡すオブジェクトと同じレコードにマッピングされたオブジェクトが
すでにセッションにあると例外が飛んできます
つまりupdate()するオブジェクトをfind()とかしちゃダメ
http://d.hatena.ne.jp/koichik/20040812#1092329105
0753デフォルトの名無しさん2005/07/20(水) 09:47:56
ふつうにfindしたオブジェクトを変更してupdateしてるけど・・・

>>745の人が>>728の人と同じ人なら、>>733という意見なので、ごちゃごちゃイレギュラーなことの対応のために頭使うのはバカらしい、ということで。
0754デフォルトの名無しさん2005/07/20(水) 11:43:24
>>753
> ふつうにfindしたオブジェクトを変更してupdateしてるけど・・・
そのfindとupdateが同じセッションならupdateはムダ
>>745はセッションAでfindしたオブジェクトを変更してセッションBでupdateしようって話
そのセッションBでもfindしてるから例外になる
0755デフォルトの名無しさん2005/07/20(水) 17:58:46
>>754
>> ふつうにfindしたオブジェクトを変更してupdateしてるけど・・・
>そのfindとupdateが同じセッションならupdateはムダ
そうなのよね、同一セッション内ならFlushで更新されるからupdateは無駄なんだよね。
でも、ちまたのサンプルだと同一セッション内でもupdate呼んでる例が多い。まじめに勘違いしてた。

>>733な意見なのはよくわかるんだけど、どうやってるの?
設計段階、もしくはコーディングのルールとして開発者が「意識して」オブジェクトの内容を
変更しないように気をつけているの?
それともなにか別の仕組みとして、開発者が意識しなくても制御できるようになっているの?
誰かおせーて。
0756デフォルトの名無しさん2005/07/20(水) 18:14:39
必要なモノ取り出したらSession閉じればいいじゃない
0757デフォルトの名無しさん2005/07/20(水) 21:38:27
>>755
マッピングオブジェクトへの変更は、DBの変更のために行う。
マッピングオブジェクトを変更したときにDBが変更されないように「意識して」設計したりしない。
0758デフォルトの名無しさん2005/07/26(火) 03:50:15
Hibernateでの質問です。
DAOレイヤーのオブジェクトをビジネスレイヤーより下の階層に渡すってのは
あまりやらない方が良い事なのでしょうか?
evictした後に渡すべき何でしょうか。
その辺悩んでおります。
0759デフォルトの名無しさん2005/07/29(金) 22:26:39
Hibernate 3.*にXML-DataBindingの機能が搭載されているようなんですが、さわってみた人いますかー?
CastorXMLみたいなことできるか?
07607592005/07/30(土) 14:12:07
とりあえず試してみたよ。マーシャル・アンマーシャルにdom4jを使っているんだな。パフォーマンスで分が悪そうな感じがする。
マッピングファイルを使ってある程度自由なXMLを書き出すことができるのはCasterと一緒か。
0761デフォルトの名無しさん2005/08/09(火) 17:07:54
外部キーについて
many-to-one関連で主キーを使ってマッピングした場合は外部制約を正しく生成してくれるが、
property-refを使ったmany-to-one関連はまったく生成してくれなくて困っています。(hbm2dllで)

何かパラメータの指定で出来るのか、
それとも元々property-refでの関連では外部キーを使わないものでしょうか?
(出来れば主キーにマッピングしたいところだが、
外部のデータと連携するために他のDBと一意のユニーク値で連結する必要があるので)
0762デフォルトの名無しさん2005/08/15(月) 14:58:34
Hibernateについて質問です。
オブジェクト生成に独自のコンテナ(といってもSpringですが)を使っている為、
オブジェクトのインスタンス化をフックしたいのですが
Interceptor.instantiateをインプリ面とすれば良いという所までは突き止めました。
しかし、この関数 id を引数に取るのですが、オブジェクトに id を設定してやらないと
エラーになってしまうようなのです。しかしながら、 Hibernateを使っている方なら
ご存知の通り、 id はHibernateの設定ファイルで自由に指定できます。
Hibernate自身の設定ファイルの設定に従ってオブジェクト id を設定するような
インターフェースは無いものでしょうか。
07637622005/08/15(月) 15:36:44
すいません。自己解決しました。
マニュアルにしっかりのってました。。
SessionFactory#getClassMetadata
0764デフォルトの名無しさん2005/08/18(木) 19:36:33
.hbm.xml に、versionとtimestampの用途がイマイチわからない。
timestampにはoptimisticロックの「安全性の低い実装」とあるから、使うのをとてつもなく躊躇する。
じゃぁ、安全性の高い実装は何なの?と思ったり。
versionもトランザクションが長い場合に使うとあるのだが、自動的にインクリメントされるの?
ロックの競合を防ぐために使われるもの?説明が足りなくてこまるなぁ。
使ったことある人、どういう用途で使ってるのか、実用的かを教えてクリクリトリス
0765デフォルトの名無しさん2005/08/19(金) 00:50:48
VERSIONの場合、SQLのUPDATEを発行するたびにVERSIONにマッピングされたフィールドがインクリメント
されるわけだ。

具体的にはユーザAがある列をSELECTする(VERSION=0)。ほかのユーザBが同じ列をSELECTする(VERSION=0)
で、ユーザBがなにか変更してUPDATEをおこなう。このときVERSIONは1になる。さらにユーザAも何か変更
してUPDATEしようとする。しかし、自分の知っているVERSIONより新しくなっているので更新できずに例外
が発生する、というわけだ。

まぁ、WEBアプリなんかではありがちな手法だと思うが。便利かどうかはシステムの仕様次第じゃないか。
ちなみに間違ってても責任とれんので実験してみてくれ。
■ このスレッドは過去ログ倉庫に格納されています