Java⇔RDBのMapping-Frameworkを語るThre Vol.3
5 :
デフォルトの名無しさん :04/07/24 16:16
カイエン 名前が激しく気に入った
8 :
デフォルトの名無しさん :04/07/24 16:25
お前らよ、 Eclipseで DbEditプラグイン、JFaceDbcプラグイン、QuantumDBプラグイン、 MNPZ Eclipse SQL Environmentプラグイン、 EasySQLプラグイン、SQLDeveloperプラグイン、JDOプラグイン、 Eclipse Plugin for OJBプラグイン、Hibernatorプラグイン、devtoolプラグイン、 Cray Database Modeling Plug-in, Attrezzo per Xindiceプラグイン、 DB Copyプラグイン を使ったことあるか?
QuantumDBとMNPZ Eclipse SQL EnvironmentとHibernatorは使ったことある
>>7 ダグラス・カイエンを連想するかポルシェを連想するかで駄目さ加減がわかるなOTL
12 :
デフォルトの名無しさん :04/07/24 20:13
>>10 実はDbEditしか使ったことがない。
がDbEditはグーなり
14 :
デフォルトの名無しさん :04/07/24 21:53
Cay・enne ━━ n. カイエンヌ ((フランス領Guianaの港市で主都)). cay・enne ━━ n. トウガラシ (cayenne pepper).
さらに親父は海援隊を(ry
>>13 まぁFF6の主人公達はかなりFSSから名前を持ってきてるわけだが。
ティナのファミリーネームとかな。
Cayenne/JDBC/SQLite ってやってる人います?
Java WorldにCayenne特集が載ってたよ。最新号だ。
>>8 jFaceDbcは、2.xを使ってた。
用途は、Hibernateの基本マッピングファイル作成。
スケルトンとなるマッピングファイルが1テーブルづつ作れたが、
複数テーブルの一括作成機能ってのは無かった。
3.0以降は試してない。
あと、Hibernate Syncronizerとかいうのも使った。
これもマッピングファイル生成。こっちは一括作成できた。
24 :
デフォルトの名無しさん :04/07/26 10:07
>>19 ほんとだ、Tapestryと併用するってか?
しかもインストールも以外と簡単なんだな。
Java Worldみて、「リスペクトする」って便利な言葉だと思ったよ。
26 :
デフォルトの名無しさん :04/07/27 19:41
28 :
デフォルトの名無しさん :04/07/31 14:25
29 :
デフォルトの名無しさん :04/08/01 10:41
これってどうよ?
PObjGen (Eclipse plug-in)
http://eclipsewiki.net/eclipse/index.php?PObjGen PObjGen はデータベースアクセス用のコードを生成する Eclpse 3.0 用プラグインです。
ウイザードからアクセスしたいテーブルとそのカラムを選ぶと、
そのテーブルのレコードを SELECT, INSERT, UPDATE, DELETE できる
Javaコードが生成されます。 現在 DB2 v8.1 対応のものの評価版を公開しております。
いろんな環境にある、ウィザード形式でマスタメンテ作れるソフトね。 結局使わない・・・。 ORマッピングじゃないね。 強いて言うならRelation - Interfaceマッピングか。
少し前の盛り上がりが嘘のよう
>>31 やはり、「共通の敵」がいるのが一番もりあがるね。
よーし、じゃあ俺が悪役やるね。 地球を征服してやる。
おながいします。
>>33 違うよ、MapでDBアクセスを征服だよ。
漏れは制服がいいんでしょうか?
いまはユニフォームの時代です。 ラクロスらくろす。
マクロスまくろす。
よーし、じゃあ俺が悪役やるね。 地球から制服をなくしてやる。
>>39 断固阻止!お前はこのスレの北朝鮮に認定!
おれはブッシュやるね。
爆撃するぞ〜爆撃するぞ〜徹底的に爆撃するぞ〜
おまいらMap厨よりゴミクズだな
でもMap厨より微笑ましい気もする(w
っつうか、制服がなくなるくらいなら、HibernateもCayenneも使わずMapでやるよ。
おまえら、Hibernateはキャッシュの制御が手間だし、CayenneはSQL発行のタイミングが制御しづらいですよ。 そんな無駄なもの使わずMap使っとけ。 Map。 セッターゲッターしかないクラスもムダ。 Mapがいいですよ。 だから制服はなくさないでください。 ついでに看護士っていうのもやめて看護婦にしてください。 客室乗務員じゃなくて、スチュワーデスにしてください。
ああ、漏れも同意だな。Mapいいよ。Map最強。 だからアンミラの制服はなくさないでください。
おまえら、今時OR-Mappingなんてつかってんの? 重量級だし融通きかないしイイコトないじゃん。 今後も今まで通り、Mapで決まりだよ。 これは理由とか条件とかそんなんじゃあない。 定めだよ定め。運命だ。宿命といってもいいかな。 もはや、Mapは宇宙の心理とも言えるかも。 Mapを別のMapに入れて、それを集めてまたMapを作る。 さらにそれを複数つかって新たなMapにツッコむ。 こうして、美しいフラクタル図形のようなMap構造ができあがっていく。 しかもそれは、ガウディのサグラダファミリアのごとく、 「永遠に完成しない、という完成」を持っているわけだ。 そんなこともわからねーやつは、永遠にITブルーワーカーやってろっての。 おまえもか、ではない。ブルワーカーじゃねーぞ。 通販じゃ売ってないから、導入には注意しろよ。 俺は徹夜で仕事したから、今から帰るぞ。あばよ。
48 :
デフォルトの名無しさん :04/08/04 10:44
Hibernateなんかバージョンアップしてもしかたないんだよ。 オブジェクトモデルとリレーショナルモデルのギャップ埋めるより、事務服のおねえさんがオレの心のスキマ埋めてくれた方が仕事がはかどるんだよ。
前スレの47は神だったのに。
そうか?
Hibernateさわろうと思って見ると、コードが分散しすぎていて、チュートリアルとしては失格だな。
そこでORが似合う制服を考えるのでつよ!!
55 :
デファルトの名無しさん :04/08/05 02:39
先生、HibernateってSQL書けないんですか? HQLとかじゃなくて普通に。 複雑なクエリーのやりかたがわからないんですが。
SQLもかけるじゃん。もっとよく調べろよ。
HibernateのSessionからJDBCのConnectionを取得すれば、 SQL投げようがストアド起動しようがやりほうだい。 しかし、Hibernateのメリットを生かせない罠。
>>57 ありがとうございます。
session.connection().createStatement()...
なるほど、コネクションは取れるわけですか。
トランザクションとかは、Hibernateと一緒にできそうですね。
ちなみに、検索結果を、ResultSetじゃなくて、
Hibernateで作ったビーンに詰めて返したいんですけど、
そういうのはできないですか?
(DBUtilsな風な利用法か、設定ファイルにSQL書けて結果はビーンになってるとか。。。)
>>57 そこまでしてhibernate使う意味あるのか?
>>62 どもです。
MiddlegenでXDocletタグを生成しつつ、XDocletタグからhbmファイル生成するところも書き足しました。
64 :
メソドロジスト :04/08/09 16:50
RDBなんてもう古いよ 所詮テーブルのストアだから いずれオブジェクトグラフの保存に適したODBに取って代わるだろう
と言われつづけて早十数年
>>64 ODB ってよくワカランのだが、インスタンス化の範囲ってどうやって決めるの?
給与明細に社員名だそうとして、社員オブジェクト持ってきたら、
家族構成とか住所とか配属履歴とか余計なインスタンスがくっついてきたり
しないんですか?
70 :
デフォルトの名無しさん :04/08/10 00:31
>>66 HibernateとかCayenne使う感覚と同じだよ。
っていうか、HibernateとかCayenneとかが、ODB使う感覚でRDB使えるようにしてるんだけども。
で、この辺の技術のおかげで、ODBは出る幕がなくなった。
一時期はXML-DBなんてのも持て囃されたけど、 あまり聞かなくなったな。 企業ベースではレガシーな資産が残る限り、まだまだRDBの天下は続くだろうよ。 そこでMapの出番ですよ(w
>>72 それは、最近の情報に疎いだけでは・・・
むしろ最近やっと実装をみかけるようになってきた。
>>72 >>73 そうそう、最近よく聞くようになってきたよ、XML-DB。
あれってDB再構成無しに属性追加とかサクっとできるところが
よさげだ。
マッピーお役ご免?
属性追加くらいならRDBでもできる‥よね? そういう単純な話ではないのかな?
>>75 RDBだと、あるデータだけ属性追加、とかは間違っても出来ない。
>>76 そういう場合は子表を作るのがRDBの流儀、でしょ
でもXML-DBの場合、バイナリを大量に突っ込むような用途の場合、 パフォーマンス的にどうなんだろう?
XML-DBだからといって、XMLファイルでデータを持つわけじゃないし。
Hibernateでラージオブジェクトって使える? Hibernate Synchronizer使ったら ラージオブジェクトのカラムに対応するフィールドがStringになっちゃったんだけど。 DBはPostgreSQLです。
>>76 ,77
本当?それとも性能や運用の面でそうすることが多いということ?
>>83 ま、少なくとも、仕組みとしてはあるデータだけに属性を追加というのはできない。
どうにかして実現するとしても、属性がデータによって変わることがあるものは、RDBではかなり表現しづらい。
なんとかデータを格納しても、検索やりづらいし。
その属性の値が存在しないということを表現するために nullってモンがあるわけだけどね。
Hibernateで、TorqueみたくRDBのスキーマドキュメント生成するツール ってあるんですか?
Hibernateで用意されている必要性がわからん。
>>85 nullがあるとしても、1万件のデータのうち、ひとつのデータにだけある属性のために9999件のデータにnullを入れるのはムダだし。
ほかのデータには別の属性が複数あったり、ある属性は複数のデータがもっていたりすると、ひとつの表で表現するのは非常にムダ。
alter tableしてinsertする、というオペレーションも避けたいし。
また、そのうちのある属性は配列になっていたり、複合属性になってたりすると、データの表現だけで大変な労力が必要になってくる。
データの整合性を保つというデータベースの役割は果たせなくなるし。
>>85 そのデータにはそもそもその属性がないのか、属性はあるけども値が割り当てられてないのか、判断できないね。
>>88 そこまで統一性が無い場合って、例えばどんなデータでしょうか。(イメージつかめてない)
(まぁ少なくともJava⇔RDBからは外れそうだけど。)
あ、あとRDBばっかり触ってると、RDBで表現できない分野のデータについて想像できなくなる
>>91 アンケート情報は定型化しなきゃ駄目じゃん、と思ったけど、何種類も違うや
つを一緒に管理する場合と理解してOK?
>>93 1回のアンケートは定型化できても、次回は少しだけ項目がかわるということはよくある。
実際に聞きたい項目は定型化していても、あとの質問での答えを引き出すための質問は質問対象によって変わるということもありうるし。
バカ? 顧客ID アンケートID アンケート質問 アンケート回答 みたいなテーブルつくっておけばいいだけじゃん。 項目増えてもオッケーでしょ。
まあ上の例だとまずいかな。 ID・質問マスタは別に用意すべきだろう。 でも、RDBで十分対応できる範囲だな。
と、アンケートを甘く見てると、そう思うわけだね。
>>96 複数回答ありの項目があると、結構簡単に破綻するけどね。
>>98 そういう場合は単に枝番を振るなりすればいいんじゃないの?
顧客ID アンケートID 枝番 回答ID
これでオッケー
前の絡む3つが主キー候補
>>100 複数設問、複数回答、修正可能、履歴ありの項目があると、結構簡単に破綻するけどね。
>>101 複数設問って、どんなだ?
普通、アンケートって複数設問があるけど、そういう意味じゃないよね。
俺も後で考えたけど、選択入力の項目と自由入力の項目があって
自由入力はしばしば「その他」を選択入力として選んだ場合、
とかだったりするのが、汚くなりやすい要因なのかなあと思ったり
したですよ。
多分FKによる外部参照制約をつけにくくなったり、ほとんどの場合に
NULLであるようなVARCHAR(4000)のカラムが必要になったりとか。
postgresでtext使ってハイ終了
>>103 じゃ、どんなテーブルでも ID と text 1個でハイ終了・・・
>>101 履歴をどう利用したいかにもよるだろうけど
履歴テーブルをドン、と作っておいて
トリガーでコピーとかもアリ
>>100 じゃあ、複数回答のある項目の中に複数項目が含まれるときは?
「お持ちのパソコンと、インストールしている主なソフトとそのメーカーを答えてください。」みたいな。
ありうる設問に対してすべて対応できるようなテーブル設計って、気が狂いそうになる。
>>104 そこにXML形式のデータ入れておけば終了。
>>107 で、そのXMLの中のひとつで検索したい場合にインデックスも
張れないと。
ってか、おまえら Mapping Framework を語れ。
DBUtilsも入れてもいい?
>>103 はVARCHAR(4000)に対するツッコミだろ
CLOBが使えなかった頃の典型的なテクという気もするけど。 CHARと違って実際に4000バイトの領域が自動的に使われちゃう という訳ではないからね。
>>88 ムダかどうかはここでは別の話なんで措いておくとして、
そういうデータの表現がRDBだと難しくてXMLなら容易だと
考えるのはばかげている。
>>113 RDBではひとつの表では表現できなくて、XMLで非常に素直に表現できるのは事実だが。
>>89 RDBではそもそもそのふたつを区別しない。
XMLでもおなじことだけど。
>>115 XMLであれば、タグを書かなければ表現できる
>>114 なんで一つの表で表現しなきゃならんのだ?
#
>>114 にとって「2つ以上の表を扱うのは難しい」ということ?
>>117 ひとつのデータの集まりを表すために2つ以上の表を扱うのは、かなりめんどくさいよ。
マッピング使えばある程度楽にはなるけど。
素直に表現できるのであれば、素直に表現できたほうがいい。
ま、表をごりごりつなげるのが苦ではないなら、RDB使ってればいい。
実際には、ほとんどのシステムで、RDBでの苦よりRDBでの楽が勝るから、RDBを選択することになるんだけど。
>>117 素直に表現することの価値がわからなければ、わからないだろうね。
よーし次はNDBだあ
>>118 CODASYL頭のSEがRDBを否定しているのを見てるみたいだな。
問題領域をRDBにマッピングするのはめんどくさくて、XMLに
マッピングするのは「素直」?
やっぱり単にRDBの使い方を知らんだけのようにおもうが...。
>>122 話の流れが読めん奴だな。
話題に出てるような、属性がデータごとに異なるものをRDBにマッピングするのはめんどくさくて、XMLにマッピングしたほうがより素直に表せるという話なのだが。
一般的に言えば、属性が動的に変わるデータはRDBで扱いづらい
> ひとつのデータの集まりを表すために2つ以上の表を扱うのは、 > かなりめんどくさいよ > ま、表をごりごりつなげるのが苦ではないなら、RDB使ってればいい。 DQN決定 在る意味Map以上に凄いかもね君。
何のために正規化しているのか…
>>123 いや、だからどの程度の「動的」を想定してんの?
アンケート程度では、正直RDB否定論の根拠としては薄いと思うよ
>>125 正規化されたデータを2つ以上のテーブルに分割する場合がめんどくさいんだよ。
アンケートの場合でも、属性を無限に増やしていけば、正規化されたままで表現はできるわけだから。
>>126 別に否定してるわけではないし、XMLの方がより素直に表現できるといってるだけ。
>>127 >正規化されたデータを2つ以上のテーブルに分割する
正規化されてねぇんだよ、それ
>>124 正規化してテーブルの数を増やすと、実装の手間が増えるのは事実。
それが許容できる範囲かそうでないかは別の話で。
>>128 データ1には属性1があり、データ2には属性2があり、・・・データnには属性nがある場合、ひとつのテーブルに属性1〜nを持たせるのは正規化されていないわけではないだろ。
それをパフォーマンスの問題なんかでテーブル分割を分割すると、めんどくさいことになる。
>>130 そのテーブルに疑問持ってないの?本当に?
おかしいと思わないの?
>>130 もう少し具体的に話してみて。それだけだと、
データID 属性種別 属性値
という形の表にできそうに見えるから。
>>123 それXMLスキーマとRDBのDMLで書いてみてよ。
本当にRDBの方が複雑って言えるか?
仕様が決まれば表現できるのはアタリマエのような・・・ 変化に対する適応力の話に見えるなあ。 RDBって表を変えるのが相当大変じゃない?
>>134 ここまでかかってやっと本題だね。はっきりいってそこが一番の違いだと思うよ。
>>134 属性の追加、テーブルの追加で済む程度のものであればなんの
問題もないというのはガイシュツ。
もしデータモデルに大幅な変更があった場合、XMLなら変更が
簡単、なんてことはない。
140 :
デフォルトの名無しさん :04/08/14 23:30
>>137 その場合でも、XMLでできてRDBにできない変更というと、数値型の
属性を文字型にするとかくらいかな?
そんな変更するくらいなら、俺なら素直に属性追加するが。
「何の問題もない」といってるけど、実は・・・
ID XPATH VALUE こんな表でXMLの真似事ができそうだな。 ID NAME TYPE CHAR_VAL INT_VAL DATE_VAL... とかでバリアントの真似事....はさすがに嫌だな。
>>135 やっと本題って、データのモデルが違うから、RDBで表しやすいデータや、RDBで表しにくいけどXMLでは表しやすいデータがある、というのが本質なんだけど。
それをなんか、例えばであげたものの揚げ足をとって、RDBでも十分とか、話の本質を理解せずにツッコミいれてる奴がいて混乱させてるだけ。
結局、モデルのギャップを埋めることの大切さを理解してないという点では、ROマッピングの意味をわからずMAPでも同じことができるからROマッピングは必要ないといってたのと同じ。
それはまた別
>>143 そこんところをもちっと本質的に説明できる例を挙げてくれりゃ
他も納得するんだろうけど。簡単に揚げ足とられるような「例えばで
あげたもの」じゃなくてさ。
RDBで表現するよりXMLで表現するのに適したデータというのは
確かに存在する。たとえば既にXMLで表現されたデータそのものとか。
でもじゃなにも言っていないのとおなじこと。
一方で、RDBのテーブルに一対一で対応する形のデータ以外は
すべてリレーショナルモデルへの落とし込みが必要なわけで、その
意味では「めんどくさい」のも確か。
でもそれはRDB遣いにとっては常態であって、ことさら困難を言い
立てるものでもない。また、適切なモデルに落とし込む手間が必要と
いう意味ではXMLも同様。
そこまでの前提を置いた上で、XMLモデルで表現するのは容易だが
リレーショナルモデルで表現するのが困難なケースにどんなものが
あるかというところが問題なわけ。
要は上で挙げられた、RDBでは「間違ってもできない」「かなり表現
しづらい」「データの表現だけで大変な労力が必要」ってところの
揚げ足を取られない例を挙げて欲しいわけなんだが。
適しているかどうかはそりゃあるんじゃね? それより、変化への対応の話をしたいんだが。 昔みたいに1年かけて作って7年そのまま稼動、みたいなことは 少なくなってきてるんだし。
>>146 そういう話がしたいってんなら自分でしろよ。
まず
>>136 に対してなにか言いたいことはないのか?
すぐに「適しているかどうか」の話に引き戻そうとするのがウザイ
と言ってるだけ。
RDB経験豊かな人に尋ねたいのは、対応しづらい仕様変更はあったか、
それをどのように対応したか、という経験談。
ただ、
>>145 みたいな
>でもそれはRDB遣いにとっては常態であって、ことさら困難を言い
>立てるものでもない。
みたいな寒い発言は勘弁していただきたい。
すぐに「今まで無かったから今後もいらないだろう」の話に引き戻そうとする方がウザイ
>>148 >すぐに「適しているかどうか」の話に引き戻そうとするのがウザイ
オレはXML-DBの使いどころの話をしてるから、それは当然だ。
>RDB経験豊かな人に尋ねたいのは、対応しづらい仕様変更はあったか、
>それをどのように対応したか、という経験談。
>>134 の話を続けたいのかと思ったがどうも違うようだな。
他の香具師が乗ってくるよう手前で話を振らなきゃ、望み通りの
議論にならんのはアタリマエだろう。ワガママ言うなよ。
152 :
デフォルトの名無しさん :04/08/16 10:43
Hibernateで、複数のJNDIを使い分けることは可能なのでしょうか? テーブルA jdbc/hoge1ds テーブルB jdbc/hoge2ds
RDBに、ツリー構造のデータを放り込む良い方法ないですか。 子が親へのポインタ持ってるだけだと、上から降りて検索するのが SQLの繰り返し発行になってしまって非常に遅くて困るんですが。
ツリー1個に ID つけて その ツリーID もってるレコード全部取り出したら
>>154 全部というわけではなくて、特定ノード以下だけ選択したかったり…
ID工夫するしかないかな?あるいは、親ノードIDと子ノードIDの対応表
だけ別に作るか…アタマイテ。
>>155 汚い手ですが、ツリー上のノードを示す「パス」をカラムとして
持てばいいのでは。
正規化とは反対の方向になりますがね。
>>152 複数のセッション使えばいいんじゃない?
結局なんだったのかなぁ ORマッピングにこだわりすぎてROマッピングがやりにくかったとか?
>>153 「再帰SQL」でぐぐれ
今ならたいていのRDBMSで使えるだろ
162 :
デフォルトの名無しさん :04/08/23 17:24
>>161 実装してるのはDB2だけだと思ってたけど、他にもあったっけ?
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"); }
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"); }
165 :
デフォルトの名無しさん :04/08/23 21:47
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"); } }
166 :
デフォルトの名無しさん :04/08/23 22:06
最新のベータ版を使っての 感想: java.util.Listはimport文を生成しているのに java.util.Dateと直接書いてるのが納得いかない。 同様に、package1.Mode objという書き方も納得いかない。 同じパッケージ内ならそんなもんいらんちゅーに。 _PROPERTYという名前の定数はどうにかならないのだろうか? BIRTHDAY_PROPERTY という変数を使っているにもかかわらず"birthday" という文字列を直に使うとはどういうことか?
>>162 Oracleでは階層問い合わせだな。
SQL ServerではYukonから使える模様。
169 :
デフォルトの名無しさん :04/08/24 09:49
>>167 Generation Gapパターンが使われているんだし
java.sql.Date使われていないんだったらimport宣言してもええじゃん
と激しく思うんだが。
>>169 なんかの拍子にimport java.sql.*ってやったらエラーになるからじゃないの?
import使わずにフルパッケージ指定してくれればベストか。
172 :
デフォルトの名無しさん :04/08/26 02:26
>>170 いまどきimportに*を使う香具師はDQN
と、条件が限定されるローカルルールを押し付ける奴もDQN
と、自分の主観を押しつけるヤツもDQN 漏れモナー
俺もあいばてぃすって呼んでた。やっぱiMODEとかiMACの影響だな。
Hibernateでコネクションプールってどうしてる? アプリケーションサーバーのDataSource使ってる? HibernateからDBCP or c3p0? MySql3.xだと、c3p0でごみセッションがのこりやがる。 DataSource使いたいけど、うまくいかね。 この辺のドキュメントってどこかに纏まってないかな。
WEB+DBの最新号読んだが。 SeaserDAOってどうなん?
>>178 > WEB+DBの最新号読んだが。
> SeaserDAOってどうなん?
君の感想は?
>>179 そういう君の感想は?
サンプルプログラムにコメントが全然ないのが笑った。
Seasarの人たちって「美しいソース書けばコメントなんか不要」というポリシーなんだろうか。
>>181 あんなシンプルなソースにコメントいるか?
まー、人それぞれだけどな。
またドキュメント厨か(w
認定厨という言葉を最近知って衝撃を受けた
>>183 認定厨乙
>179 あ、ごめん。レス遅くなりました。 俺の感想としては、既存のSQLとの併用の割合がよさそう、て感じかなぁ。 後は、Hibernateみたいな自動生成ツールがどのくらい整ってるか、気になった。 >180 あんがと、これからスレとか見させてもらうわー。
186 :
デフォルトの名無しさん :04/09/05 23:45
最近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にも値入る。)
なんか使いづらそうな気がするんだけどこの使い方であってる?
普通はこんなことしない?
書き忘れ。 dao.findは↓synchronizerで生成した奴そのままだけど。 public java.util.List find(String query, Session s) throws HibernateException { return s.find(query); } sはnet.sf.hibernate.Sessionのインスタンスです。
>>186 クリテリアでとってくりゃいいんじゃない?
うまくいかない場合は、バクテリアも使ってみるといいぞ。
クリリンは鼻がない
191 :
デフォルトの名無しさん :04/09/07 01:50
>>186 つうかdao.find("from User u Where u.Username='hoge')でええんじゃないの?
193 :
デフォルトの名無しさん :04/09/17 16:30:26
age
hibernateを導入するときってtop-downとかbottom-upとかいろいろありますけど、 業務で使おうって人はどれが多いですか?
195 :
186 :04/09/18 22:28:50
>>192 >>186 の例でそれやると
UserテーブルをSelectして一行取得するごとにStatusテーブルをSelectしない?
>>195 many-to-oneでしょ?
適当にJOINするでしょ。
>>194 結局最初にDBありき。
オレテキには、そうするべきだとも思う。
誰に訊いても「そりゃDBありきだろ」と言われた俺
また写真が増えておるな。そのサイト。 気にせずjoinしてくれてるんだけど、なんか設定が違うんかな。
>>177 ではないんですが、私も気になる。
みんなどうしてんの?
>>201 つまり、DataSourceがうまく設定できない自分の無力さを悩んでいるだけだと思われるが。
俺はとくに問題なくDataSource使ってる。
>>201 では202さんに聞いてみましょう。
先生教えてください!>202
といっても何て設定して駄目だったか書かないといけませんね。
客先常駐になっちゃったから、ちょっと待っててください。
今日はJavaWorldのアンチパターンの記事を読んで、目から鱗でした。
まだまだ未熟者です。ガンガリまーす。
S2Dao
>>203 <property name="connection.datasource">java:comp/env/jdbc/test</property>
とやってるだけで、特別なことはやってないけど。
Hibernateの設定用GUI(Eclupseプラグイン?)で、なにかお薦めありますか?
設定なんか手書き。いっかい書けばいいだけだし。
>>207 質問に答えてない。
>>206 HibernatorもHibern8もイマイチだから、XDocletの直書きがやりやすい。
>>208 質問に答えてない。
結局Middlegenでマッピング生成して、XDocletで調整、で十分だからな。
> 207
手書き一回ですか。なれた人はそうなんですね。
いろいろと考え直す事が多い私にはちょっと無理です。
> 208
ワラタ。XDoclet、ちょっと調べましたが、
* @hibernate.property
*column="FIRSTNME"
って感じでメソッドの上にずらずら書くだけで自動生成
してくれるんですね。xml手書きよりはずっと楽そうです。
GUIでやるより結果的には楽なのかも。
>> 210
ttp://www.hibernate.org/102.html なるほど。先にDBに表を定義してしまうんですね?
結局レスポンスに影響があるのはRDBなわけだから、RDB主体で設計するべきだと思うのだよ。 RDBのためのツールはたくさんあるし、簡単なスクリプト持ってるやつも多いだろうし。
>>211 まったく関係ないけど,あなたDB2のSAMPLEデータベースつかってますね?(笑)
>> 212 確かにそうですね。index張ったり,表スペースいじったりと 結局はDB側をなんとかしないとパフォーマンスでないですしね。 で、Middlegenを試していたのですが、これセットアップ めんどくさくないですか?ANTが無いと起動もできない。。 build.xmlファイルをいじったり*.jarをコピーしたりして なんとか動くまでになりましたけど。 >> 213 あたりです。 やっぱFIRSTNMEの微妙なつづりはDB2のSAMPLEだけの特徴かな。
>>214 middlegenとhbm2javaのタスク書くと、だらだら長くなりますね。
どうせXDoclet使うのだから、antは必要です。
なんでここでhibernate?と思ったけど、hibernateスレ無いからか。 maven使えば多少はmiddlegenの煩雑さから開放されるかも。
ちなみにHibernateのcriteriaは クリテリアじゃなくてクライテリアだから。言っとく。
>> 214 もう一つだけ教えてください。 DBに表を作成 -> Middlegenで*.hbm.xmlを作成 -> hbm2javaで*.javaを作成 という流れだと思うのですが、XDocletをどこで 使うのですか? *.javaに手で@hibernateを追加するのですか? それとも@hibernateも自動的に作成される?
>>218 マッピングの調整。
最初から全部Middlegenで設定するのは不可能だし。
っていうか、Middlegenで設定するのはめんどうだから、自動生成だけして、設定はXDocletでやる。
XDocletタグは、なんかフラグ立てれば自動的に生成される。
実際には、
->Middlegenでhbm作成
->hbm2javaで*.javaを作成
->XDocletでhbmを作成
となるようにしておく。
そうしないと、テーブル追加したときがめんどくさい。
テーブル追加したときはhbm2javaで該当テーブルだけ*.javaを精製するようにする。
hbmは全部上書きされちゃうので、XDocletでもとにもどすというわけ。
△hbm2javaで ○hbm2javaの部分で
>> 219 即レスありがとうございます。参考になります。 やっぱり@タグは自動生成できるんですね。
削除フラグのあるテーブルを扱うマッピングのパターンみたいなの、どっかありますか?
Hibernateのキャッシュサイズってどこかで決められる? 無限に取り続けそうで怖くて使えね。
224 :
デフォルトの名無しさん :04/10/09 21:41:54
Hibernateって検索の仕方がいろいろありますが(HQLとかCriteriaとか)、 みなさんはどのように検索していますか?
CriteriaでできるところはCriteriaでやってる。 柔軟な条件の拡張がやりやすいから。 条件にあうものから10件取得しつつ、検索全件数を取得、とかがやりやすい。 Criteriaでの件数取得はパッチ当てる必要があるけど。
226 :
デフォルトの名無しさん :04/10/10 01:24:22
>> 225 パッチって、Hibernateにパッチを当てる必要があるという事ですか?
パッチ当ててもいいし、パッチが当てられたバイナリ使ってもいい。
228 :
デフォルトの名無しさん :04/10/10 12:14:42
EclipseプラグインでHibernatorプラグインというのがあるのだが どうだろうか?
XDocletで十分だなぁ。
だれも使ってないのかもしれないけど、個人的にはiBatisが一番楽だな。 とにかく簡単、明解なんで。
うん。おれもiBATIS好きだな。それこそまさに、SQLをそのままPOJOに マッピングしてる感じで。
俺も愛用している。 BLOBとかつかえんのが困るけど、他のマッピングツールとかって対応してるのかな?
>>235 SQL直書きの薄いラップが必要な箇所というのが部分的に必ずあって、そのためにHibernateを使うことをあきらめることになってたりするからねぇ。
結局、前スレかその前あたりで話題になってた Hibernate使用時の表結合のあたりはどうなったんだ?
え、全然問題ないけど。 神とされてたサイトに結合の記述がまったくなかっただけ。
Map厨の人、なつかしいなぁ。 またこないかな。
240 :
デフォルトの名無しさん :04/10/13 11:28:31
hibernate.cfg.xmlでmapping resourceを指定しますが、 数が増えると大変です。 まとめてhbmファイルを指定する方法はあるんでしょうか?
242 :
186=199 :04/10/13 21:51:02
>>238 上で結合で困ってた物ですが教えてください(つД`)
from User user inner join fetch user.Status status inner join fetch user.Group group Where user.Username=?
↑みたいにfetchで全テーブル指定すれば目的のオブジェクト(User)だけ返ってくるのはわかったけど
毎回必要の無いテーブルまで全て指定しないといけないのが激しくダルいです。orz
今3つだからまだ我慢できるけど関連テーブルさらに増えたらやってられんす。
>>237 そんなあなたにiBatis
どんな結合であろうと、複雑なSQLであろうと完璧対応です。
insert, update, delete もトランザクションで完璧です。
>>241 検索すればいくらでも出ると思うけど。
hbm.xmlにmany-to-oneとか核だけ。
>>242 その例だったら別に from User user where user.Username=? で
全部の関連がつながった User が帰ってくると思うけど。
>>237 確か前スレ47ノサイトでは
Object obj1 = obj[0];
Object obj2 = obj[1];
Object obj3 = obj[2];
みたいなことしてたんだっけ?(うろ覚えだけど)
マッピング定義で結合してない場合の話だね。
Criteriaでやるなら session.createCriteria(User.class).add(Expression.eq("Username", aaa)); とかでついてくるし。
250 :
242 :04/10/14 12:06:24
>>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を外部ファイルに記述して読み込みたいと思ってます。
lazy loadingがわかってないとか?
lazy loadingについて詳しい解説キボン
>>251 lazy-loadingはone-to-manyでは?
>>250 関係ないけど、HQLを外部化するのってどうなの?
なんかメンテ性あがる?
コンパイルするのがめんどくさいというだけ?
>>250 outer-join="auto"
とか。
ハイバネって集合関数できないんだ。。。 countしたいときはListでとってsize()呼ぶしかないのかな。
結局、関数ガリガリ使いたい場合はこういうのは使えないことが多い
>>256 , 257
自分の無知さをさらけだしてますな。
変に略すやつは、まともな知識をもってないってことだね。
結局、どういう場合に結合ひっぱってきてくれないんだろう? userテーブルとuserDataテーブルが結合されてて Query q = sess.createQuery("from User as s where s.userName = :userName"); q.setString("userName", "イチロー"); for(Object o : q.list()){ User user = (User)o; System.out.print (user.getUserName() + "-"); System.out.println(user.getUserData().getAverage()); } とやると、ちゃんとuserDataからデータひっぱってきてくれるんだけど。
ま、Virtualizationやhand-written SQLサポートなんかの説明を「Hibernate3入門記」で書いてくれるはずなのでヨシとするか。
>>266 > ひっぱってきてくれるけどSQLはN+1回出てるはず
え、1回でやってるけど・・・と思ってSQLのログよく見たら、joinしてない。
でもgetUserDataごとにあるはずのSQLがログに出てない。
なんでだ?と思ったら、直前にCriteriaを試してたので、そのキャッシュを使ってるらしい。
ということで、1件ごとにSQLを発行するのが問題なければOKだけど、joinしたければ明示的に記述
しろ、ってことか。
最近Hibernateスレと化しているな。
>>267 ぐはぁっ
気が向いたら頑張りまつ.
それから266に書いた257は256の間違いです.
>>270 よろしこ
Criteriaの件数数えたいときにはどうしたらいいんだろうね。
HB-474にVoteするしかないのかな?
ぐはぁっ て、うざすぎ
>>272 orz
>>273 voteしたから許して。
でも、ちょっと見た感じCOUNTだけでAVGとかは無理?
GROUP BYやHAVINGも?
別の手も欲しいかも。
>>274 話の流れとして、Aggregateクラスを導入してこんなのようよ?となってるみたい。
Criteria criteria = session.createCriteria(Some.class)
.add(Expression.eq("any", value);
Aggregate aggregate = criteria.aggregate();
Double sum = aggregate.sum("property");
Double avg = aggregate.avg("property");
long count = aggregate.count(); // would "property" be needed here?
List objects = criteria.list();
そして、拡張性がないだろ、ってことで却下されている。
sumのmaxとかどうするのさ?みたいなね。
group byできるように考えると行き詰まるようだ。
春の話みたいなので、今どうなっているのかわからないけど。
ttp://www.mail-archive.com/[email protected] /msg03389.html
しかし選択の幅が広がるのは良いものの、こんだけ増えてくるとそろそろ つかれてくるな....
OODBに移るまでの辛抱なのかのう…?
RDBからOODBに移るということはもはやありえないし、選択の幅が増えるといっても現実Hibernate3かEJB3で落ち着くから問題なし。
Cayenneも結構いいと思うんだけどなあ。
Cayenneって、どこがいいの?
モデラー付いてるしな。 あとは好みだろ。
Hibernateも、Middlegenと組み合わせればいいだけだし。 実際の開発に入れば、モデラーより、どんな強力で柔軟性のあるマッピングしてくれるかの方が大事だと思うけど。
Cayenneのドキュメントを読んでると、Enterprise Object Frameworkの引き写しにしか.... だってEOFのドキュメントと同じようなこと書いてあるんだもん。
>>284 や、はなからそういう「オープンソース版の EOF」みたいなのを目指して
作ってるんじゃなかったっけ....?
おれはむしろその思想に興味を持って使いはじめたクチです。
で、後から WebObjects も買ったけど、いまでは Cayenne しか使ってない(笑)
で、Cayenneってどこがいいの?
>>287 そこに書いてあるCayenneのいいところって、GUIツールが付属ってとこだけじゃん。
あとのサンプルは、HibernateのCriteriaでも同じようにできることだし。
GUIツール使いたければMiddlegenがあるわけだから、Cayenneの特徴がよくわからん。
>>275 なるほど。
いわれてみればHibernateのCriteriaって、
session.createCriteria(Cat.class)
という使い方をするように、
「永続オブジェクト(この例ではCat)のリストを取得する」
ことが主目的で(例外はALIAS_TO_ENTITY_MAPを使った場合)、
任意の結果を得たければHQLを使えということか。
だからSELECT句を指定する手段が無くて、そのために
GROUP BYで破綻するのかも。
対応を考えるのは悩ましいね。
>>288 ハイバネート触ったこと無いんでよく分からんが、
JavaコードかDBスキーマがまずありきで、それをマッピングを介して
変換する感じでしょ?
どっちもない場合にマッピングを書いてコードとスキーマを生成する場合は、
手書きでマッピング書かないといけないの?
Cayenne の場合、DBスキーマありきでリバースしてクラス作るのもありだけど、
GUIモデラでモデリングして、そこからコードもDBスキーマも生成する、
ってのが取っつき易いかも。
(モデラが吐くマッピングファイルは XML だから手編集も可能)
まー正直 GUI モデラがまだ貧弱でもっと進化しないとだけど、
どっちも似たり寄ったりってことでいいんじゃねーの。
国内ユーザ数はハイバネートの方が多そうだから、どっちでも良ければ
ハイバネート使っとくといいんでは。
現実問題として、まずDBありきだからね。 ボトルネックになることが多いのはDB側の処理だし。 で、DBのスキーマを生成するツールはそれこそゴマンとある。 ExcelでDB仕様から生成するマクロ組んでるところも多いだろうし。 Hibernatorだかなんだか、マッピングをまず作成するツールもあるし。 まあ、Hibernateを便利に使うツールは、探せばけっこうある。 問題は、Cayenneは主キーのフィールドを隠すので、かなりやりにくいってことだ。 それにマッピングで実現できない場合の、HQLのような逃げ道がないし。 実際はCriteriaよりもHQLが推奨のようだけど。 どっちも似たり寄ったりというには機能に差がありすぎ。 Cayenneに強いこだわりがない限りはHibernateを使うべきだと思う。 EJB3とのからみなど、将来性を考えてもね。 Hibernateは日本語版のドキュメントも出たしね。 で、Cayenneってどういうところに強いこだわりをもてるのかな、と。
>>289 ただ、柔軟性を求めるのが難しいのなら、「バカチョン集計」つけて欲しいんだよね。
どっちにしろ複雑な集計はHQLでできるわけだからね。
今のままだと、簡単な集計でもHQL使わないといけない。
Cayenneの目指すところは、設計の考え方からして、EOFと同じなんだろうね。 DBを覆い隠してしまってオブジェクトだけで操作する。そしてフレームワークの 中にあるものをあまり意識させなくて(XMLの書き方とか)、マッピングだけに 集中できるようにツールを用意する、などなど。 主キーをフレームワークが面倒をみるのがデフォルトというところも、EOFと同じ。 主キーの管理はデータの内容と結びつけるべきではない、主キーはDBの内部的 必要性のためにあるのだ、という考え方みたい。 TheServerSide.com見てても、ポイントは結局Cayenneのモデラーを使った マッピング作成は、Hibernate+Middlegen+XDocletより簡単だ、というところ みたい。「既存のDBをHibernateにマッピングするためにXMLをがりがり書いた が、Cayenneを使うとすぐにできてしまった。それだけで価値がある」とか いう発言がフォーラムにあった。 しかし一番の差は、HibernateはPOJOをDBにマッピングする技術、Cayenne はDBをオブジェクトにマッピングする技術っていう、方向の違いじゃないか。 CayenneのデータオプジェクトはすべてDataObjectのサブクラスになるわけ だし。
>>295 Cayenne はマッピング貧弱なの?
色々考えた上でSQL書くのが楽しい俺なんかはどうする まー、クソ設計だからそうなるんだがな 俺が設計したワケじゃないからしゃーない
俺もごちゃごちゃした集計する会計の帳票とか 一発SELECTでもってきて、わー早くなったーとか喜んでる SQL大好き野郎なんで、S2Daoはちょっと使ってみたく思っています。
>>296 貧弱ってことばはふさわしくないかもしれないんだけど、すべてが賄えるほど強力じゃない。
ひととおりは揃ってるんだけどね。
ちょっとみた感じHibernateのCriteriaと同等みたいだから、優位性が。
HibernateならHQL使えるから、Criteriaが強力である必要があまりないんだよね。
というかSpringとかSeasarのサポートがない時点で、使うの萎える・・・。
俺の場合は、何でもフレームワーク側でやろうとするのは無駄な労力かかって 本末転倒だと思ってるんで、複雑な結合とかはビュー作って、 フレームワーク側からはもうほとんど1テーブルそのまま持ってくるのと 親子関係にあるレコードを toHoge() で取り出すくらいしかやってないなあ。 どんな道具も万能じゃないんだから、適所適材ってことじゃないすかね。
Cayenneどうよって思ってるのは、その適所が、Hibernateの適所に完全に含まれているんじゃないの?ってこと。 Cayenneが使えるところであればHibernateは完全に使えるけども、Hibernateが使えるところでもCayenneは使えないことのほうが多い、と。
じゃ黙ってHIBERNATE使ってりゃいいぢゃん。
思っているだけで、実際そうなのかはわからないから、Cayenne使ってる人に聞いてみたいんだよね。
( ゚д゚)ポカーン
>>305 乙。
HQL生成するんだね。
いいかも。
Expressionは欲しいときに自分で実装と。そしてここに貼り付ける、と。
本家のCriteriaってこういうことできるようになる気配はないんだろうか・・・
Criteria使ってdistinctな検索ってできますか? 関連テーブルのせいで、同じのがいっぱい取れて・・・。
>>306 3.0alphaでも変わり映えしないみたいね。
>>307 setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
Hibernateで継承使ってみた。 こいつはいいよ。 SQLテンプレートではなくマッピング使うメリットとして大きいかも。 例えば、memberテーブルのtypeフィールドによって処理が違う場合をポリモーフィズムで実現できる。 それとmemberテーブルとpurchaseテーブルは1-多なんだけどpurchaseテーブルに登録できるのはtypeが2のときだけ、とかをJavaの型で保証できる。
ただし、継承関係にあるとき以外は継承を使わないこと。 当たり前だけど、念のため。
typeの値を変更する処理は行いにくいけど、そもそもtypeを変更する処理が必要な場合には、それは状態なので継承をつかっちゃだめ。
Hibernateのone-to-oneを使うと、レコード読み込むたびに関連テーブルへのselectを行うんですが、これをオンデマンドで行う方法はありますか?
レコード読むたびにselectするのはオンデマンドじゃあないのか?
必要ないときもselectするから、オンデマンドじゃないんですわ。
HQLだとjoinになってくれた。
と思ったらキャッシュにだまされていた。
対1関連の場合、プロパティに無条件にProxyをセットするとか出来なくて、 それをnullにするか関連先のオブジェクトを設定するかしないといけないから どうしようもないような。 関連を外すか、関連先を使わなくてもfetch joinする方がいいかも。 もしかするとHibernate3にプロパティレベルでのlazy initializeみたいな ことが書いてあったので、それが解決策かも?
fetch join してもいちいちselectしてる・・・ なんでだろう。
321 :
デフォルトの名無しさん :04/10/25 04:55:30
うーん、proxy使ってみたら、確かに最初のSQLは一回しか発行されてないんだけど、そのときは主キーしかとってきてない。 だから、レコード使うときに主テーブルと副テーブルの両方への問い合わせで、あわせて2問い合わせを発行してしまう。 全然意味なし。むしろSQLの発行量が倍。 同じコード/マッピングのままHibernate3alpha使ってみたけどいっしょ。 なんかコードかマッピングか変更したらいけるんだろうか。 それにしても、one-to-one使ってる人は、実際どうやってるんだろう。
主キーしか取ってきてないって、もしかしてiterate()使ってない? iterate()だと関連なくてもそうなる。 Session#find()またはQuery#list()でfetch join使えばSELECTは1回になるはず.
323 :
デフォルトの名無しさん :04/10/25 13:15:42
>>322 Session#findはHibernate3で使えなくなるので使わないようにしてるというのは置いといて。
Query#listでfetch join使ってもレコードごとにselectが発行されちゃってます。
Hibernate3のpropertyレベルlazy access、リファレンス見るとほんとにpropertyにlazyが付けれるだけでone-to-oneには付けれないみたい。
実際にlazyつけたらalphaではまだ対応してないみたい。
これも試してみたんだけど。
How do I set up a 1-to-1 relationship as lazy?
ttp://www.hibernate.org/117.html#A16
やっと解決。ってか解決しないことがわかった。 副テーブルが主テーブルとは違う主キーを持って、別に外部キーを持つようにして、property-refを使ってたんだけど there are some problems with one-to-one property-ref in 2.x that are fixed by Hibernate3 ということで、property-refを使うone-to-oneはHibernate3ではうまく動かないみたい。 っていっても、Hibernate3alphaでもうまくいってないんだけど。 とりあえず、副テーブルが主テーブルと同じ主キーを持つようにしたらちゃんとlazyになりましたです。
蛇足ですが… 1対1で外部キーを使う場合はなぜかmany-to-oneを使うことになってます。 リファレンスの例もそうなってる。最初は間違ってるんだろうと思ったけど Hibernate in Action に解説があった。orz
「驚いただろ? でもな,Hibernateにとってはone-to-oneもmany-to-oneも大差ないんだ」 くらいにしか書いてない。 気持ち悪いけどそういうものだと憶えるしかないらしい。
まあ、実質、副テーブル側からみればmany-to-oneかone-to-oneっていうのは外部キーがユニークであるかどうかってだけで、1レコードを見ればどっちでも同じだからねぇ。 でも、大差ないならone-to-oneにしてくれればいいのに。
・・・こんどは、lazyにするためにconstrained="true"にすると、追加ができないことに気づいた。 one-to-oneって、すごく使いづらい気がする。 主テーブルのキーはsequenceで、副テーブルのキーはforeignにしてると、まず主テーブル側を追加しようとすれば副テーブルデータが永続化されてないので怒られ、副テーブル側を追加しようとすればキーが決めれないので怒られ。 それではと主テーブルのcascadeをsave-updateにすると、先に副テーブルのデータを追加するもんで、そのキーが主テーブルにないのでデータベースに怒られ。
結局主テーブル側でone-to-many、副テーブル側でone-to-oneにすることでつつがなく解決。
331 :
デフォルトの名無しさん :04/10/27 21:43:04
from SubHoge だとうまくいかないんですね?
>>332 from SubHoge
だけであれば,SubHogeの全インスタンスが問題なく戻ってきます.
具体的にやりたいのは,
HogeのサブクラスSubHogeA,SubHogeBがあり,
SubHogeBとHogeにmany-to-manyの関連を定義.
あるSubHogeBに関連する,SubHogeAの全インスタンスを
列挙する って操作です.
SubHogeBから関連をたどって,HogeのSetを取得,A,Bに分類した
上で,Bについては,再帰的に探索する,という感じに考えていたんですが.
>>333 参考になるかは謎だけど…
リファレンスに書いてあるように、where句に埋め込まれたクラス名は
discriminatorの値に変換されるらしい。
ところがjoined subclassだとdiscriminator値は指定していない。
でも抜け道はあって、マッピングファイルに記述した並びで
0から順にdiscriminator値が割り当てられているように扱えるっぽい。
BaseのサブクラスとしてSub1とSub2がこの潤で定義されているとすると、
Baseは0、Sub1が1、Sub2が2。
よって、次のように記述するとSub1のみ取得できる。
from Base b where b.class = 1
>>334 ありがとうございます.マッピングファイルはXdocletで生成しているので,
並び順に頼るのも難しいです.
結局,idを条件に使うことで解決しました.
from Hoge h SubHoge s where h.id = s.id
337 :
デフォルトの名無しさん :04/11/15 21:28:52
Hibernateでマルチバイトのカラムを扱った際に、 なぜか主キーが1つのテーブルのみupdateメソッドとdeleteメソッドで こんなエラーが出ます。 誰か原因知っている人いませんでしょうか? net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 001, of class: test.model.vo.NdMemo
>>337 findとかloadしたオブジェクトとは
「別のインスタンスだけど、主キーが同じもの」を作って
それをupdate/deleteしてないかい?
339 :
デフォルトの名無しさん :04/11/16 11:40:05
>>338 返信ありがとうございます。
たしかに、別のインスタンスで主キーが同じものを作っています。
ということは、update/deleteをする場合は、一度ビジネスロジック側で
loadなりfindなりして、インスタンスを生成し、それに対して変更する
値をセットするという形の実装になるのでしょうか?
>>339 うん、updateの場合は、そうだよー。
で、ごめん、deleteの場合は、
主キーさえ合ってたら(他の値に関係なく)削除される、だったはず。
結論:Liquid Data
>>339 まず、Session#update()はいわゆるオブジェクトの更新ではない、
ということに注意。
update()は、以前に別のセッションで取得した永続オブジェクトなどを
現在のセッションに関連づけるために呼び出すもの。
結局は更新されるんだけど、単に更新するだけならfind()等で取得した
永続オブジェクトのプロパティを変更すればいいだけ。
update()を呼ぶ必要はない。
もし、339が生成したオブジェクトの内容をHibernateに
更新してもらいたいのなら、update()を呼び出すのは間違いとは
言い切れない。
しかし、残念ながらそのセッションで同じ主キーを持った
永続オブジェクトをfind()等で取得済み(自覚ないみたいだけど)
なので例外が吹っ飛んでくる。
更新したければ,
セッションから取得したオブジェクトを変更するか、
セッションで取得したのと主キーが重ならないのをupdate()に渡すか、
二つに一つ。
>>340 delete()でも同じセッションに主キーが同じ永続オブジェクトがあると
その例外が吹っ飛んでくるよー。
344 :
デフォルトの名無しさん :04/11/22 15:21:23
うわ、ほんとだ。Apache iBatisになるのか。結構好きなORマッパなので、その方が 名を知られそうでいいように思いますね。
> 346 同感。 個人的にHibernateとかの大がかりなO/Rマッピングソフトより、 やる事が単純な分、使いやすくて、理解しやすいのがいい感じ。 名前が売れて、メジャーになってくれれば、 プロジェクトで採用しやすくなるので、今後が楽しみ。
名が売れてといえば、UNIXの開発で、オープンソースなリソースは使うなって いいつつApacheはOKってなところがあった。 まあHTTPサーバだけを指してるんだろと思ったけど、話してるとApacheが HTTPサーバ以外も出しているってこと自体をよく分かってなかったみたい。 もしかしてApache iBatisという名前ならおkが出るんだろうかw
apacheの一部ですって言ってあげたら? せっかく誤解してくれてるんだから。
アノテーションぶりぶりのS2DaoよりiBatisのほうが初期学習コストが低そう。 頭の中身がレガシーな漏れの同僚たちにも受け入れられやすいと思う。
もう、Hiberanteでいいよ。 XDoclet1.2.2でhibernate.cfg.xmlもつくれるし。
352 :
デフォルトの名無しさん :04/11/28 23:01:14
HibernateのHQLってFromにインラインビュー使えないんだ。 Group Byの集計単位が異なるテーブルを外部結合したい時とかに 個別に全行Fetchしてから自前ハッシュ結合しなきゃいけないのか・・・。 なんかMySQL使ってるみたいで鬱になる(´・ω・`)ショボーン その辺をDBに依存せずに書けるようになるといいんだけどなぁ。 結合するまでWhereで行数減らせなくて、さらに行数の予測ができない 場合だと致命的かも。こういうの業務系だと頻繁にあるし。 こういう制限ってどうやって対処してんの?>Hibernate使いの皆様
>>352 俺はハイバネート使いではないが、ある程度複雑な SQL になったら、無理矢理
プログラム側でどうこうしようとしないで DB 側に View 作ってるよ。
何でもかんでもプログラムで実現するのはムダな努力だと思う。
楽するためのもので苦労する必要はないだろう。適所適材で。
Java使いはSQLが嫌いなのれす
>>352 ORマッピングは、複雑なSQLをどうにかしてくれるもんじゃないからねぇ。
>>353 それしかないよなぁ・・・。
割り切ってしまえば問題はないんだけど、Unit Testを
HSQLDBでテーブル作成から行って、実稼動はOracleなんて
構成にしようと思うと、DBに依存するとやりづらくなるから。
あれ?HSQLDBってそもそもインラインビュー使えんのか?
母さんはそんなこと知りません! ごちゃごちゃ言ってないで早く寝なさい!
そこでS2Daoですよ
>>358 SQL厨にマッチするのはiBatisでしょ。
>>356 さすがに無理がないかい?
テストのためにアーキテクチャをひずますのも本末転倒だし。
>>356 hsqldbのユーザーマニュアルの、SELECTの項を見る限りでは、使えるように思える。
FROM句の次に「sqlstatement」って書いてあるし。
>>359 それが嫌だからO/Rマッピング使いたいんじゃん。
でも、O/RマッピングがSQLと比べてまだまだ貧弱だってこと。
>>360 そんな無理あるのかな?
現状は無理でも、DBへの依存を断ち切ることはO/Rマッピングの
究極の目標なんじゃないのかって思ってるんで。
開発環境のDBってゴミデータに埋もれがちで、動かないのが
データのせいなのか、プログラムのせいなのか解析するのに
手間がかかることよくあるし。
DBを扱う場合のUnit Testって、データまで含んで完結するしさ。
それに、複数環境で動かせられるってのが必須って要件は少ないと
思うけど、可能にできるならば品質の向上にも効果あると思う。
DBUtilsが軽めで分かりやすくていいと思ったが、 where句の条件式がコロコロ変わるようなのだと キツいかと思った。 SELECT * from Employ WHERE name=? or tel=? or ・・・項目いっぱい みたいので、telが存在しない場合は条件式に含めない、となると同じようなSQLをプロパティファイルに いっぱい記述するかWHERE句だけ動的に生成するか。で動的に生成するとせっかくSQLを 外部ファイルに出している意味が激減。 iBatisなんかはどうなんでしょう。
>>362 DBのUnitテストはDBUnitを使えるときは使ってますが
362タンはどうしてます?
DELETE INSERT でテストデータを投入するのはUnitテスト的には
かくあるべきと思うのだけれどもテスト用スキーマを作らせてくれない
環境だと使えない。
>>362 > 現状は無理でも、DBへの依存を断ち切ることはO/Rマッピングの
> 究極の目標なんじゃないのかって思ってるんで。
現実的に無理だね。
DBに進化を止めてもらわないかぎりは。
構文的に問題なくても、DB機能の違いが多すぎる。
ORマッピングは、DBを考えなくてよくするしくみではなく、DBはDBで、JavaはJavaで考えれるようになるしくみだし。
良くも悪くも、単なるマッピングだよ。ラッパーじゃない。
それにここで問題にしてるのは、マッピング機能ではなくて、HQLの表現力という話だね。
環境依存SQLをラップする共通言語が欲しい、HQLにその役割をもって欲しいってことでしょ?
iBatis、S2DaoのスタンスはSQLが環境依存なら、SQLをそのままJavaオブジェクトに マッピングしてまえっ、って感じか。ORマッピングというよりは、Object-SQLマッピングという感じ?
>>362 > 現状は無理でも、DBへの依存を断ち切ることはO/Rマッピングの
> 究極の目標なんじゃないのかって思ってるんで。
DBに依存しないのに、何故OとRをマッピングする必要があるのかと。
素直にOODBを作ったほうがいいんじゃないかとさえ。
>>363 iBatisは動的なSQLが可能。
if これが0以上ならとか
>>368 俺もそう思う。オブジェクト指向かXMLでやるのが自然だな。
現在のO/Rマッピングはあくまでマッピングだから、RDBMSが持つようなスケジューリングの最適化機能なんてのは無い。
もしあったとしても特定のRDB製品限定にならざるおえないから、O/RマッピングツールのどのRDB製品でも同じようにっていう概念と相反してしまう。
>>363 DBUtilsはゴミだな。
名前付きパラメータすら使えないし、型マッピングが固定だし、
パラメータにnull渡せないし、コネクション引っ張りまわすか、
毎回DataSourceから取得する作りだし。
実際使ってる人がどうやってるか知らないけど、まともに
使えるようにするには相当被せなきゃだめっぽい。
>>364 DBだけってのはあきらめて、ロジック側でデータ足したり
しながらやってるよ。テスト終わったらRollbackして。
>>366 >それにここで問題にしてるのは、マッピング機能ではなくて、HQLの表現力という話だね。
>環境依存SQLをラップする共通言語が欲しい、HQLにその役割をもって欲しいってことでしょ?
話ずれたけど、主題としてはこれを言いたかった。
DBってあまりに標準ってものがなさ過ぎるから。
そのためのツールとして、現時点では理想と現実の折り合いで
一番センスいいな、と思ってるのがHibernateだから、
多くのDBで普通に書けるSQL程度はサポートして欲しい、と。
>>368 ,370
究極の目標って書いたのは、DBの持ってる機能は最大限利用しつつ、
それを意識せずに使えて、十分なパフォーマンスが得られるってことだよ。
その時にはO/Rマッピングとは呼ばなくなってるかもしれないけど。
ちょっと極論すぎてぼやけてきたんで、どうでもいいけど。。
ORマッピングとまたその上のレイヤーを組み合わせたフレームワークがあればいいんだろうけど。 でも、やっぱりリレーショナルモデルとオブジェクトモデルという異なったモデルを使う以上は、完全なラップは無理そうだ。 アプリケーションを高度に部品化すれば、DBを意識しなくてもよくなるだろうけど、そんときはORマッピングどころの話じゃないしね。
>>364 >>362 じゃないけど、
環境標準のテストデータを整備して、
setUpメソッドで、自分のテストデータを投入して、
tearDownメソッドで、標準のテストデータを投入するのはどう?
あるいは、setUpメソッドで既存のDBデータを読み込んでIDataSetに格納して、
tearDownメソッドでDELETE_INSERTするとか。
(えらく時間がかかりそうだし制約とかがからむとヤバそうだが)
スレ違いかも・・・スマソ
374 :
デフォルトの名無しさん :04/12/06 23:47:54
>>374 たぶん、それだとJavaコードの自動生成とかDBの自動生成で不満がでるんじゃないかと。
XDoclet使うのがいやなら、テーブルは別に作って、Javaコードとhbm.xmlを別々に書いたほうがいいと思う。
どちらにしてもテーブルは自力で作って、一発目のクラスとhbmはbottom-upで作った方がいいと思う。
あとは、XDocletを使ってJavaコードだけをいじるか、Javaコードとhbm.xmlを別々にいじるか、にしたほうがいいと思われ。
376 :
デフォルトの名無しさん :04/12/07 13:58:33
TopLink、結構いいですよ。 商用だけあって、GUIとかマニュアルとか ちゃんとしているし。 RDBMSがOracleしか選択しないのであれば、 悪くない選択だと思います。 Oracle以外のRDBMSでも動くけど、 サポート面が恐いよな。
Hibernate3にも実装されるし、SQLテンプレートは必須ってことだね。
>>374 @hibernate.collection-keyが抜けてるからじゃない?
ドキュメントだとcolumnが書けるように見えるけど、
xdt側では何も見てない。
@hibernate.set
lazy="true"
cascade="none"
name="CAPABILITY_ID"
@hibernate.collection-key
@hibernate.collection-key-column name="ENTITY_ID"
@hibernate.collection-key-column name="CAPACITY_ID"
@hibernate.collection-one-to-many
class="solutionCapability.VoiceCapability"
382 :
デフォルトの名無しさん :04/12/08 22:33:56
Cayenne1.1 Finalリリースage
>>381 @hibernate.collection-key の column は省略不可って
書いてあるから、試してないけど、今度試してみます。
middle-out に移行したので、すぐには試せないけど…
つーか、buttom-up で @hibernatedoclet 吐いてるのって、
middlegen だったのね。@hibernatedoclet 付の .java に戻すには、
中→下→中→上 と生成しなきゃダメなのか…。
>>383 middlegenってcollection系は結構間違えたの吐いてたよ。
XDocletもキーや外部キーとかで一部の属性が無視されたり。
素直にhbm書いたほうが一番楽ってこった。 DB仕様書から吐くマクロ作っておけば無問題。
マクロつくるなら、マッピングクラスもついでに吐けばいいね。
hibernateのHbm2JavaTaskを使ってBeanを作ってるが、 コメントなど日本語の部分が全部文字化けする・・・と思ったが OSのデフォルトエンコードで出力されるんだね。(プロジェクトはUTF-8) いまはGeneratorを書き換えてなんとか使ってますが、ファイルエンコードを外部から 指定する方法ってあります?
388 :
デフォルトの名無しさん :04/12/13 01:12:04
MySQL使ってるんだけど、InnoDB を使わず MyISAM のままにして、 FK 制約とか cascade とかの、リレーション的機能はHibernateにおまかせ、 という開発スタイルはなんか問題ありますか?
389 :
デフォルトの名無しさん :04/12/13 01:25:51
>>388 どうなんだろ
別にいいといえば言いが
Hibernateとかのフレームワークって
トランザクションどうしてんの?
390 :
デフォルトの名無しさん :04/12/13 02:58:01
大規模PJでHibernate使ってもう3回目。もうメリットを感じない。疲れた
既存のものを移行するタイプの場合、既存DBの質にも寄るが Hibernateはほとんどの場合使い物にならない
393 :
デフォルトの名無しさん :04/12/13 08:14:49
たぶんあれだろ 実際のプロジェクトでDBが最初にかっちりと決まっているわけではなく コロコロ変わったりすることもしばしば そのような状況の中、コーディング作業も同時進行しちゃうから そのたんびに設定ファイル書き直しとかいうのがイヤなのでは? 結局、自分のところ自分で修正するならSQL(JDBC)直で書いてあるソースのほうが直しやすい
>>393 それって、それなりの規模があるなら、SQL直で書いてあるソースのほうがいやになりそうだが。
DBのコロコロ変わる変更が、フィールド追加くらいのものじゃなく、構成として変わるような起こるようなら、ORマッピングがどうのじゃなく、その組織自体に疲れたってことじゃない?
ORマッピング使わないにしても、愚直にJDBCプログラムするのは、ただ手間がかかるわけで、なにか仕組み使うだろ。
そこでiBatisですよ。
EOF! EOF!
398 :
デフォルトの名無しさん :04/12/15 00:50:09
基本的にビジネスドメインモデルとDBのモデル構造はちがう、マッピングできない いろいろあるがこれが根本か、夢を見ていたおいらがあほだった。 あと、 Javaやって6年くらいになるが ・オブジェクト指向厨は運用や保守のことをまったく考えていない ・ソースを読まないオープンソース厨がおおい ・DBはJavaだけのものじゃない でもiBatisは気になる。
>>398 相当レベルの低いところでやってたんだね。
うつってるよ。
そう、会社でまともなシステム開発は無理 気心知れた仲間内でサービスまでやるプロジェクト立ち上げ中。 おいらたちの合言葉 「仕事は適当に切り上げて、夢は家で見よう!」 60%くらいで働けばその辺のやつらの100%以上は十分働けるよ。 全開で頭使うのは会社以外で
なんかDB->ビジネスドメインモデル->Strutsアクションフォームのこの データのコピー処理作業がおそろしく無駄に覚えてきたStrutsで仕事な 今日この頃。 やっぱWebObjects + EOFみたいに、DBのモデルをそのままビューでも 使う、コントローラでも使う、モデルの変更は直接ビューに影響するって のが楽でいいわ。
>>398 > オブジェクト指向厨は運用や保守のことをまったく考えていない
それは OO は関係なく、単に厨だからでは。
>>398 > ソースを読まないオープンソース厨がおおい
全体からみればオープンソースのソース読む方がむしろ奇特だと思われ。
>>401 BeanUtils使うだけじゃだめなん?
>>403 そうゆう輩がおおい。
たいてい、完全なマニュアルもサポートもないオープンソースを使うとき
ソースだけが頼り。
Hinernateのようにマニュアルがこれだけきちんとしているもののほうが珍しい
それでもソースは重要
OpenSourceってどういう意味や精神しってるかい?
昔はオープンソースプロダクトを使うとき必ずコンパイルしたものだ
昔は昔。 今は今。 昔は、オープンソースは情報に敏感な一部の技術者が、趣味的にいじることが多かった。 今はオープンソース製品が広く認識されて、特に高いモチベーションを持つわけはない普通の技術者が業務としてオープンソース製品に触れるわけだ。 今はオープンソースと言っても、原理主義的オープンソースから、単にソースが公開されているだけのオープンソースまで、人々の認識は多種多用だし。
LinuxやJavaを牽引する役目を背負ったオープンソース。 政治的思想を広めるという使命を背負ったオープンソース。 同好会的な内輪ノリのオープンソース。 人生色々、オープンソースも色々。
408 :
デフォルトの名無しさん :04/12/16 09:23:23
>>405 >OpenSourceってどういう意味や精神しってるかい?
マニュアルを販売して、大儲け。
>>408 ちがうよ、ちょっとした付加機能追加して、有償販売して大もうけ。
基本開発に金だして、テストやサポート、バグフィックスはタダ働きのボランティア任せ
オープンソースよりほしい漏れ専用クローズド彼女
オープンソースで無料のほうがいいね。 ウィルス埋め込まれてたらやだけどね。
最近はこんなやつらばっかしだ。 問題がおきたとき情報集めてソース読んで対処するのはいつもおいら。 疲れたな
ORM使うと、ビューとの兼ね合いが難しくならない? ビューは使えなくなるね。
?????
ビューで書くか、マッピングの設定で書くか、迷える。
418 :
デフォルトの名無しさん :04/12/25 13:50:06
>>414 問題が過ぎ去った後
自分の努力を誰も理解してくれない寂しい状況になる
そんなクリスマス
DBアクセスの速度を考えて、結局ビューにしてしまったクリスマス。
421 :
デフォルトの名無しさん :04/12/25 19:37:26
そしてビューにした結果 詳細ドキュメントの修正を依頼されたクリスマス
そんなクリスマス。 ところで、ビューってORMと共存しにくくなかった?
ビューごとにマッピングオブジェクト作るっていうのはどうなんだろう?
ここでいってるビューってなんなんだ?
DBのViewでしょ。
少なくとも、MVCのViewじゃないと思う。
ORマッピングツールによるが、OR側でちゃんとリレーション定義してれば 問題なくORでいけるんじゃないか?
429 :
デフォルトの名無しさん :04/12/26 01:29:53
つうかね、DBを正規化しようものならパフォーマンスがどーのこーのって話になる で、結局でかいプロジェクトになるとパフォーマンスでないから 夢見るきれいな形にはなってくれない
>>424 ヨヨ「オレルスの仲間達!みなさんもちからを!」
「私に力を!強さをください!」
ヨヨ「ビュー……あなたも……お願い……」
「私、ビューには嫌われてる……」
「私がいることで、ビューをいやな気分にさせてしまう……」
「それは分かってるの……」
「でも……ビュー」
「貴方はやっぱりわたしの大切な人なの」
ヨヨ「いまだけでもいいの……わたしに……強さを!」
「あの頃のように!」
ヨヨ「ねえ、ビュー……もっとつよく、つかまってもいい?」
ビュー「……」
ヨヨ「もう……つかまっちゃった……」
>>429 ちげーよ。きちんとした分析もせずに画面のデータが保存できりゃ
それでよしみたいな腐った非正規化された設計になってるからだろ。
どっかのSヨがExcelで作ったゴミDBを何度見たことか・・・。
非正規化すると、重複データをメンテナンスする必要性が出てきたり、
結局はマスタチェックしなきゃいけなかったりでデメリットも相当多い。
正確に分析してあるべき姿を論理設計
↓
パフォーマンスや簡略化のために非正規化
ちゃんとやってるプロジェクトってどれくらいあるの?
脳内で適切に非正規化できる奴は滅多にいない。
正規化できる人も滅多にいません(T T)
簡単な正規化すらできないのって理解不能だよな
多分できないんじゃなくて、ぶったるんでてやる気がないんだろ。
そういうやつは本気でやってもできない気がする
>>434 それでいて残業はしっかりしていくんだよな。
437 :
デフォルトの名無しさん :04/12/28 22:05:55
正確に分析してあるべき姿を論理設計 ↓ パフォーマンスや簡略化のために非正規化 確かにこれはわかるが この変遷についていけるマッピングFWがあるのか・・・
>>437 その変遷どおりにマッピング変えればいいだけだよ。
ORMに幻想抱きすぎ。
SQLを変更するのと、どっちが手間がかかるか、安全か、天秤にかけて、適切な方を選べばいい。
>>437 そうでもないと思うよ。非正規化が絶対に必要なのは一般に思われてるほど
多くないと思ってるから、むしろORMの機能をフルに使う事を前提にして
設計した方が綺麗に無駄なく作れるような気がする。
ERD上の関係より、コレクションの関係の方が詳細に限定されてるし。
あるべき姿の論理設計って、実際はかなり大雑把なもので、最低限必要な
属性しか持っていない概念的なテーブル構成にして、極端に詳細な要件は
省いて設計して、物理設計の時点で反映させるくらいでいいのかも。
パフォーマンスの点だと、単に結合するテーブルを減らす目的の非正規化って
無駄(マスタとの結合)を減らす程度の効果しかなくて、日次や月次バッチなりで
集計結果を先に計算して誤魔化す方が劇的な速度向上が得られると思う。
それには非リアルタイムになるってデメリットも出てくるけど。
チューニングって言っても、結局、「誤魔化す>>>無駄を減らす」なわけで。
日次や月次の処理をごまかしだと捉えないほうがよいと思うが。
つうか日次バッチや月次バッチは「当然考慮すべきこと」だろ。
>>433-436 マジレスすると、そいつらには
「『正規化』という概念そのものが無い」
のですよ。
もちろん、オブジェクト指向とか、RDBとか、
そーゆー概念も無い。
【大型汎用機】とか【コピー句】とか、
そういった世界の人々が、ORマッピングの世界に流れてきて
カオスを生み出しているのが現状。
最近思うに、RDBが対象である限り、この手のフレームワークは どんどんシンプル化されて、 [RDBMS] ⇔ [必要なSQL投げ投げロジック。SQLは手書き] ⇔ [オブジェクト] に収束する希ガス。。。
>>440-441 それは受付キュー ⇒ 揃ったところで定時処理みたいな奴でしょ?
最初から処理可能時間が限定されてるようなのはまた別の話。
ただね、何でもかんでもバッチでって発想の奴多いからさ。
一度その前の綺麗な姿で設計すべきだろって言いたいんだよ。
パフォーマンスに関してのチューニングだと、
1) 無駄を減らす ⇒ インデックスの有効利用やプロシージャ化など
2) 誤魔化し ⇒ 時間かかる計算を先にして計算結果のみ利用など
この2種類のどっちかになると思ってるんだけど、どうよ?
>>443 現状でORMだけで完結できないのは同意。EJBQLもHQLも
貧弱だし、そのへんも結局SQLのラッピングだし。
445 :
デフォルトの名無しさん :04/12/29 16:36:45
君らは「糞プロジェクト」の経験が無いから幻想に浸れるのだよ 要件定義の段階で業務のすべてを吸い出すことは出来ない ようやく決まったと思ったら、他の担当の奴(顧客側)が突然首突っ込んできて 「ああ、それは違うよ 今はそう言うやり方ではない」と、打ち合わせている業務担当者でさえ知らない新事実が発覚する ほんと糞プロジェクトだよ
>>444 > 2) 誤魔化し ⇒ 時間かかる計算を先にして計算結果のみ利用など
こういうのを「誤魔化し」というのは、処理の時間方向での分散という考え方がしっかりできてないという証拠だと思ってしまうんだけど・・・
テーブルが単純に1つのクラスにマッピングできるようなシステムだと、ORMはあまり必要ないかもね。
>>446 ふーん。
じゃあ、事前集計の結果と、リアルタイム集計が同一だというの?
要件的に同一とみなして構わないってだけの話だと思うんだが。
近似値しか得られないのであれば、データ的に誤魔化してるじゃん。
>>448 近似値を得ることを誤魔化しというのも、数とか計算についての考え方がしっかりできてない証拠だと思ってしまうんだけど・・・
というか、近似値しか得られない日次や月次処理って、どんなぬるい計算してるの?
> じゃあ、事前集計の結果と、リアルタイム集計が同一だというの? いくらでも同一にできると思うのだが。
事前集計の結果とリアルタイム集計の結果が異なっていたら 事前集計の結果を上書きするようにします。 というような改竄系の仕様の乱発を求める顧客の要望には 正直ついていけないというか罪の意識さえ感じてたりします。
たとえば銀行の支店・本店間のデータ集計なんかで日次・月次データ なしで何をやれと。
リアルタイム集計と言いたいんだろうな。
事前集計と事前集計なしとでリアルタイム集計の差が出るようなプログラムが思いつかないんだけど、
457 :
デフォルトの名無しさん :05/01/03 18:54:38
O/Rマッピング何ソレ SQLガリゴリ書いて、Map配列 コレ最強
カイエンは永続化オブジェクトが、カイエンのクラスに依存するのがどうも。。。 ま、Hibernateはその分、バイトコード弄りしてくれるわけだが。 iBatisのSQLMapはCommons DBUtilsまんまでぱくりやろ。
459 :
デフォルトの名無しさん :05/01/21 00:00:22
ホシュ
JavaPressにCayenne来ましたよ。 なんかほとんど紹介だけって感じだったけどさ...
> 460 見てきたけど、ほんとに紹介だけって感じだった。 導入とGUIを使ってのマッピングと、簡単なデータ操作の方法という感じ。 Cayenneは、なかなかその次のフェーズの記事がでないな。。
少し前のWebDB+でO/Rマッピングフレームワークの紹介、比較があったけど、 結局Toplinkが一番いいという話になっててちょっと笑った。
463 :
デフォルトの名無しさん :05/01/28 01:27:58
eHibernate 3のbeta2が出た記念age
Hibernateの安定版2.1.8も出ているな。(downloadサイトに)
みんなHibernate派なんかな。
おれはCayenne派だな。
おれはiBatis派。
俺は SQL 直接で満足してしまった派。古い地球人。
iBatisについて、わかりやすく解説したサイトってありまつか?
アイバティス? イーバティス?
カタカナ表記するなら前者だと思うけど、英語での発音は中間くらいじゃない?
475 :
デフォルトの名無しさん :05/02/08 22:02:13
Hibernate の 2.1.8 では、ehcache の設定がかわってますな・・・。 (新) hibernate.cache.provider_class net.sf.hibernate.cache.EhCacheProvider (旧) hibernate.cache.provider_class net.sf.ehcache.hibernate.Provider
476 :
デフォルトの名無しさん :05/02/09 01:40:18
Hibernate in Action にある複合キーはレガシーってどういうこと? 外部参照を無意味なID値でやるってことだと、かなりDB設計技法が変わって周囲からの抵抗が予想され.....
Cayenne 1.2M2が出ているようですね。
479 :
デフォルトの名無しさん :05/02/10 07:45:45
hibernate の Criteria で select するときに、 紐付けされた別オブジェクトの属性で ソートすることはできますか? .add( Expression.eq( "master.name", new String("ほげほげ")) で、検索条件として使うのはOKなんですが、 .addOrder( Order.asc("master.name") ) としてソート条件として使おうとすると実行時に例外となって しまいます。
>>479 master.nameはselectしてる?
そうじゃないとだめなDBもあるよ。
>new String("ほげほげ")
なんでわざわざnewしてんの?
Cayenneに比べたらHibernateはショボイな。
すごい自信だ とりあえず、継承のマッピングはHibernateの方が強い。
継承に強いのはいいが、派生クラスが多くなるとSQLがやたらと大きくなるのが気になる。 joined-subclassでマッピングしてるとそのぶんleft joinするからMySQLつかうと結構問題。
まあ、継承のマッピングなんか、そこかしこでやるもんじゃないし。
>>484 しかし一番継承のマッピングするのはキモの部分だったりする
>486 日本語のシンタックスエラー。"一番"の辺りに。 クエリーを投げなおしてください。
489 :
デフォルトの名無しさん :05/02/19 22:07:59
dbutileってレスポンス悪い??
>>489 Bean 使ってる場合のリフレクション除けば、JDBC 直と変わらんだろ。
おまいの SQL が悪いか、コネクションプールしてないかだろ。
491 :
デフォルトの名無しさん :05/02/19 23:39:49
>>489 一回のSQLで大量のデータを取得するときは、
遅いんじゃないの??
>> 491 大量のデータをfetchした時は、そのデータをHDDから読み出したり、ネットワーク経由で送る時間の方がずっと大きいので、dbutilのオーバーヘッドなんか全然関係なくなるのでは。
っつか、100万件とかヒットしたら、List に全部格納 されてまう。つくりの問題。
>>493 Listじゃなくてiteretorで返すやつ低レベルAPIじゃなくてもう一皮ラップしたやつ用意してくれればいいのにね。
あと動的SQL対応。
僕の場合、Hibernateはone-to-oneとmany-to-oneでlazyが効かない(Ver2.x) のが一番の問題かな。Cayenneはこの辺どうなのかなー。 Hibernate3が待ち遠しい。
>>495 それはJavaの言語仕様の問題なので、Hibernateのone-to-oneは使わず、one-to-manyで実装しておいて、one-to-oneなプロパティを自分で作る。
List getDatas()
でone-to-manyにして
Object getData(){
if(getDatas().size() == 0) return null;
return getDatas().get(0);
}
というone-to-oneエミュレーションなプロパティを作る。
>>496 dataは複数形。単数形はdatum。
以上、トリビアでした。
Middlegenは規則名詞・不規則名詞かかわらずto-many関連のフィールドにはsをつける。 以上、トリビアでした。
♪出会った頃は〜 以上、オリビアでした。
ばぁちゃ〜ん、事故にあっちゃって、損害賠償で100万円いるんだよ〜 以上、オレオレでした。
美味しいココア風味のクッキー。 でもそれは健康を害するトランス脂肪を含んでいて、 カリフォルニア州では、子供に食べさせることを全面的に禁じる訴訟が起きちゃったんですね。 以上、オレオでした。
ためになった。感動した。
オレオの中のクリームがまずいって事かな? 外のクッキー自体は大丈夫だよね 知るかよ
>>476 にもあるかと思うんですが、Hibernateって、複合キーを扱えないって聞いたんですけど
本当ですか?
例えば、下のような会社、部署、従業員って3つのテーブルの関連はうまく扱えないのでせうか?
会社
PK:comp_id
部署
PK:comp_id, dept_id
従業員
PK:comp_id, dept_id, person_id
「うまく扱う」っていうのが抽象的で申し訳ないんですけど。
Hibernate は
>>504 みたいな糞なテーブル設計がうまく扱えないから糞。
> Hibernateって、複合キーを扱えないって聞いたんですけど本当ですか? うそです。 ところで、複合キーってなんかメリットあるの?
現実問題として、DB屋は複合プライマリキーに慣れ親しんでいる人がいっぱい いる。 そういう現実がある以上、HibernateなりなんなりのORマッピングツールが 現実にマッチしていないとしたら問題だと思うね。こっちがいくら、PKにはPK用に 項目を設けてくれといったところで、現実にマッチしてない段階で「つかえねえ ツールだな」と解釈されてしまう。 そういうのって勿体ないよね。HibernateもCayenneもEOFも複合キーから遠ざか ろうとするのは良いんだが、現実問題を解決してくれ、という気持ちにもなるわな。
既存のシステムの改修には適さないだろ やるなら新規。
>>507 現実問題として、DB屋に複合プライマリキーに慣れ親しんでいる人がいっぱいいても、コーディングが面倒になるからやめて欲しいのは確か。
そういう現実がある以上、DB屋が現実にマッチしていないとしたら問題だと思うね。
DB屋がいくら、PKを含んだ複合キー項目を設けてくれといったところで、現実にマッチしてない段階で「つかえねえDB屋だな」と解釈されてしまう。
そういうのって勿体ないよね。DB屋も複合キーで美しい設計にしようとするのは良いんだが、現実問題を解決してくれ、という気持ちにもなるわな。
>>509 あほか、大規模システムのコアは DB だ。
基幹システムのような場合、DB には Java だけでなく .net や COBOL
などからもアクセスされる。Java はただの数あるクライアントの 1 つに過ぎない。
そんな中、1 言語の中のたかが 1 ライブラリの都合なんか知るか。
思い上がりも程々にな。
あと、DB アクセスロジックを Java の中に持つなバカ。
共通化って Java の中の狭い中しか見てないだろ。
ストアドにして、どの言語からでも使えるようにしろ。
Java だけを見ていたい気持ちは分かるが。
まー、Java しか知らん香具師ほど、この気持ちは強いだろな。
あ、三流の自称DB屋さん、ようこそ
ストアドはよく使うけど、複合プライマリキーはやらんなあ… ライブラリの都合の問題とかじゃなくて、そもそもそういう設計が良い設計だとは 思えんのだが…って板違いだな
俺はどっちかというとJAVA屋だけど、510の言うことは結構同意してしまう。 509の言う「現実」ってのは「マッピングツールが対応してない」「コーディング が面倒」ってこと? 複合キーがシステム的におかしいというならわからんでも ないけど、コーディングの都合で設計を変えてくれってのは理解しがたい。 まぁ、複合キーの是非に関してはおいといて、システム組む時にはやっぱり DBありきだと思うよ。 なお、個人的には複合キーは嫌いではないし、ストアドはあまり好きでない。
>>513 複合キーのメリットってなに?
メリットにくらべてデメリットが大きいなら、設計を変えるべきだとは思う。
デメリットとしては、SQLが長くなることやら、ORマッピングに限らずプログラム上でいろんな仕組みが使いにくくなることやらあげれるんだけど。
メリットってなに?デメリットをうわまわるメリットがあるなら、考えを改める。
ところで、Hibernateで複合キーが使えないって、どういうこと?
とりあえずは使えるよね?
>>510 それなら、いっそう、いろいろな環境から使いやすい単純なキーにしておいたほうがいいと思うが。
VBのコンポーネントでも、複合キーと相性が悪いものはあるわけだし。
Delphiのコンポーネントは複合キーだと使いにくかったし。
複合キーがよくないのってコンポーネントの非サポートからの要請じゃない気がするんだが。 あるシステムではキーになってても連携する隣のシステムじゃその値を変更したいなんてことは良くあると思うし。 まあ、スレ違いだな。
517 :
デフォルトの名無しさん :05/02/26 18:33:44
自然キーである複合キーを使うか、代理キーという単一のキー値を使うか。
ER図上でカーディナリティも理解できることから、自然キーがいいという意見はもっともだ。
実際、自然キーで設計されたテーブル群のほうが多いだろう。
しかしより基本的なレベルに「キー値は不変の情報を用いる」という原則がある。
最初の設計時には不変に思えた自然キーが、機能追加時に変更の必要が出てくることがある。
これは自然キーの変更を迫るような設計変更が悪いのではなく、
ビジネスの変更に応じてキーを変えられない当初の設計が間違っている。
>>510 の考えには全面的に同意する。
異なる環境、言語からのアクセスも並列に存在することは当然想定すべきだし、
ストアドプロシージャというデータベースアクセスの抽象化手段も使わない手はない。
(パフォーマンス向上という副作用までついてくるんだし)
その上で、キーには代理キーを使うべきだ。
おれストアドは結構便利に使ってるんだけど、あれ、移植性が低いんだよな...
そんなに DB って変えるか?
まあ現実にはDB変える時にはシステム全体を変える時だったりすので 対して問題になってないんだけど、次期システム開発なんかに巻き込まれて 「DBが変わります」とか言われた時に、同じDBならストアドが流用できるのに とか考えてしまう。 まあ結局はシステムが変わってるのでストアドも作り直しになっちゃったりもする んだけどなw
> あと、DB アクセスロジックを Java の中に持つなバカ。 > 共通化って Java の中の狭い中しか見てないだろ。 > ストアドにして、どの言語からでも使えるようにしろ。 当面Javaでやって、もし他から必要ならWebサービスで呼び出せば充分かと。 必要かどうかもわからない共通化のために、開発環境の充分に整いにくいストアドでやる必要はなさげ。
>>521 なるほど、Web サービスなら .net で組みやすいな。Java を使う必要もない。
で、COBOL から Web サービスの呼び出しって実績あんのか?
HTTP でパフォーマンス落としてまで Web サービスっていいか?
>>522 えっと、必要かどうかわからない共通化にコストかけるよりはいいと思う。
間になにか(ORマッピングスレなので、Hibernateとか)かませてやっておけば、DBの移行もストアドよりは やりやすいし。
そう、ORマッピングの利点(の一つ)は、DBの違いをJavaプログラムから見えなくして 共通化すること。DBが他メーカーのものに変わっても、そのまま動いてくれる。 一方でストアドプロシージャは、ちゃんと作ればとにかく速い。いろんなテーブルのいろんな ところをちょっとずつ更新、なんて処理もそつなく高速にこなしてくれる。 実際DB・APPサーバの通信がボトルネックになる事もあるから、その辺も考慮すると、 全部が全部ORマッピングというのも考えものだよな。 まあCayenneやEOFの吐き出すダサいSQLを許容してる俺がいうのもなんなのだけど...
「全部が全部xxx」にこだわるのは、xxxに何をあてはめても考えものだな。
事の発端の
>>504 です。
なんかレスがいっぱいあって個別にレスできないのは申し訳ないんですけど・・・
みなさんありがとう。
で、Hibernateの話ではなくなってしまってスレ違いな話題ではあるんですが、
ちょっとマジレスきぼん。
>>504 で出したテーブルは複合プライマリキーだから設計がよくないって意見が大半のような
気がするんですけど、複合プライマリキーを使わないでテーブル設計する場合って↓
みたいなのでいいんですか?
会社
PK:comp_id
部署
PK:dept_idとPKじゃない:comp_id
従業員
PK:person_idとPKじゃない:comp_id, dept_id
それとも、まったく別の形?
自分でDB設計することってほとんどないんだけど、こんな形のテーブルばっかり
扱ってきたので、普通なんだと思ってました。
識者の方、お願いします。
続けて・・・ この形(複合キー)のテーブルで違和感がなかったのは ・複合キーすべてを指定してSELECTしたら、存在してれば、戻ってくるのは必ず1行 ・同じ値(例えば従業員)のレコードを挿入しようとしてもDBではじいてくれる。 っていうメリットがあるような気がするんですけど。どうですか?
>>528 > ・複合キーすべてを指定してSELECTしたら、存在してれば、戻ってくるのは必ず1行
複合キーにしなければ、1つのキーだけでも指定できる。
複合部分は主キーではないインデックスにすれば同じことが出来る
> ・同じ値(例えば従業員)のレコードを挿入しようとしてもDBではじいてくれる。
主キーにしなくてもできる
レコードを特定するのに複数の値が必要になることのデメリットの方が多いと思う。
このポリシーだと、関連するたびにキーが増えていく。
たとえば、売上に担当した従業員を保持しようと思うと、会社と部署のコードを持つ必要がある。
会社は部署からたどれるので、わざわざ従業員に持つ必要がない。
部署は従業員からたどれるので、わざわざ売上に持つ必要がない。
>>529 レスありがとう。
理解が足りなかったらごめんなさい。
>複合キーにしなければ、1つのキーだけでも指定できる。
>複合部分は主キーではないインデックスにすれば同じことが出来る
>主キーにしなくてもできる
と、いうことは極端に書くと以下のような設計がよいということなんですかね?
従業員
PK:代理キー+重複なしの複合インデックス(person_id, dept_id, company_id)
なんか、勘違いしていたような気がするんですが、設計上よくないのは、
複合「プライマリキー」で、キーは代理キーにして、
複合キーでやりたかったことは他の列で複合インデックスはってやれって感じなんでしょうか?
>レコードを特定するのに複数の値が必要になることのデメリットの方が多いと思う。
>このポリシーだと、関連するたびにキーが増えていく。
はい。そう思います。
と、いうことで、まとめると↓でFA?
会社
PK:comp_id
部署
PK:代理キー+重複なし複合インデックス(dept_id,comp_id)
従業員
PK:代理キー+重複なし複合インデックス(person_id, dept_id)
531 :
デフォルトの名無しさん :05/02/28 12:22:50
>>530 dept_id が会社内で一意で、person_id が部署内で一意だとすると、
従業員テーブルのインデックスは、(person_id, dept_id, comp_id) になるんじゃない?
結局従業員テーブルに関連テーブルのキーを入れことになるので、
俺はこういう場合は複合キーにしたいんだが……。
代理キーを使う利点って、社員を外部キーに持つテーブルのカラムが
無駄に増えなくて済むって点があると思うけど、Hibernate はこういう複数のカラムを
キー用のクラスに隠蔽してくれるんじゃなかったっけ?
ただ、そのキー用のクラスを使うのがけっこう煩わしかったような気もするけど。
Hibernate はあまり使い込んでないから外してたらすまん。
そう。 なのに、なぜかHibernateで複合キーが使えないような感じで議論が展開してる。 Hibernateじゃなくても、複合キー使うのはだいたいわずらわしい。
それと、人がみるためのキーって、人の都合で変わるからねぇ。
534 :
age :05/02/28 13:35:33
>>532 >Hibernateじゃなくても、複合キー使うのはだいたいわずらわしい
って、どういうこと?
すまん、スレ違いな話題を続けさせてもらって申し訳ない。
>>531 >代理キーを使う利点って、社員を外部キーに持つテーブルのカラムが
>無駄に増えなくて済むって点があると思うけど、
ですね。そのとおりだとは思っているのですが・・・
>>476 にもあった
>外部参照を無意味なID値でやるってことだと、
>かなりDB設計技法が変わって周囲からの抵抗が予想され.....
私もなんとなく、外部参照が代理キーになるってのが気持ち悪いというかなんていうか・・・
なので、複合キーでも特に問題があるように見えませんでした。
>Hibernate はこういう複数のカラムを
>キー用のクラスに隠蔽してくれるんじゃなかったっけ?
とりあえず、複合キー自体は扱えるようなので、
これからHibernate使って勉強してみたいと思います。
>>532 >なのに、なぜかHibernateで複合キーが使えないような感じで議論が展開してる。
いえ、
>>506 にだれも反論していないので複合キーは扱えるという結論なんだろうと思ってました。
で、それとは別に、そもそもなぜ、複合キーか?っていう議論に発展していて、
スレ違いとはわかりつつ、続けさせてもらってました。
で、大半の意見としては、
>>532 のように
・複合キー使うのは(DBのクライアント側からすると)だいたいわずらわしい。
というところなんでしょうか?
>>534 SQL直書きなら連結のための条件が増えて面倒だし、OCXやVCLのコンポーネントなんかでも複合キーになると不便だったりする。
>>535 逆にオレの場合、なんならOIDがキーでもかまわないくらい、実際に必要な値をキーにしたくない。
OIDだとはげしくDB依存するから、シリアル値をキーにするけど。
ここではすれ違いかもしれませんが、C++でのORマッピングが できるライブラリってないいんですか?
540 :
デフォルトの名無しさん :05/03/04 11:11:51
>>539 C++はわからんけど、.NETでORマッピング使いたいなら、
NHibernateとかいうものがあるぞ。
あとはC++のスレへ逝け
541 :
デフォルトの名無しさん :05/03/05 14:14:41
皆Hibernate使うときXDocletで書いてる? 既存のテーブルに対してJavaクラスを自動生成したい場合って そこでXDoclet使う意味は無いですかな? オープンソースJavaプロダクツという本には 既存のテーブルからJavaクラスを自動生成する方法が のっておらずXDocletタグつきのJavaソースコードから テーブルを自動生成する方法しか乗ってなかった orz なんかええサンプルない? それより、XDoclet2 + Maven2マダー?
542 :
デフォルトの名無しさん :05/03/05 14:24:38
いまだにJavaにかじりついてるやつっていつまで経ってもツールとかでシコシコ 遊んでてぜんぜん生産性が上がってないんだよな
>>541 使う意味あると思うよ。
クラス+hbm.xml書く手間と、クラス+XDocletタグ書く手間じゃ
大差ないし、マッピング情報をひとつのファイルに集約できる。
サンプルはmiddlegenでぐぐれば見つかるっしょ。
ただし、結構間違えたの吐くので要注意。
Hibernateではコレクションのwhere属性を用いるより、 まとめて一つのコレクションにつっこんでから、プログラム内で仕分けをするほうが 一般的ですか? where属性の中にHQL識別子が使えれば迷わずwhere属性を使うのですが...
545 :
デフォルトの名無しさん :05/03/05 21:27:00
ところで、Hibernate 3.0ってインラインビュー使えるようになったの?
546 :
デフォルトの名無しさん :05/03/07 01:51:38
547 :
デフォルトの名無しさん :05/03/07 01:56:03
>>542 「Javaにかじりつく」の意味がわからないが
2chで見た憶測かな?
Javaを初めて使った頃に比べれば生産性は大幅にあがってるよ。
HibernateやCayenneは明らかに生産性を上げるものだね。
JDBCでSQL文をベタ書きするよりは明らかに
でっかい生産性を上げているね。
べた書きするとテーブル仕様変更したとき厄介だしね。
カラムを追加したときも面倒くさいし。
549 :
デフォルトの名無しさん :05/03/08 11:09:48
つまりこういうことか いまだにWindowsにかじりついてるやつっていつまで経ってもツールとかでシコシコ 遊んでてぜんぜん生産性が上がってないんだよな
簡単だと言われ、実際に簡単そうなサンプルを見せられると「俺にもできそうだ」 という印象を受ける。 実際には、その後それについて学ばないどころか触りもしないわけだが、その 状態で暫く時間が経過すると、何時の間にか「俺にもできそうだ」が「俺にもで きる」に印象が化けてたりする。 .NET=簡単という立場でJavaを否定してる奴の相当数はこの手の類。
んまー ドトネトの考え方は 基本的に「横着」「安直」だからね。 ドトネトは合成着色料たっぷりのお菓子で子供を騙している 戦術に似ているもんね。
まともに使えるようになってから言え。 スレタイも読めない厨房にそれは無理だろうけど。
iBatisで文字列の前方一致、後方一致はどうやってやるんですか?
>>555 レスサンクス
でも、答えになってねーよ
select * from xxx where MojiRetsu like #hoge#
といったSQLの場合、
select * from xxx where MojiRetsu like #hoge#%
って訳にはいかないよね?
プロパティ#hoge#の値として%を付加した値を渡さないとできないってことでFA?
>>556 そだね。チュートリアルにも特に記述はないけど、次のようなソース部分があった。
<isNotNull prepend="AND" property="emailAddress">
ACC_EMAIL like #emailAddress#
</isNotNull>
iBatis 知らんけど col like #hoge# || '%' じゃあかんのか?
え? できるかな?
さてさてフフー
ノッポさ〜ん
んーふ んふ んーふ んんーふ
テーケテーケテケテケテー テーケテーケ テ・テ・テー
Hibernateで、同一テーブルの関係テーブル(many-to-many)は どのようにマッピングすればよいのでしょうか? 例えば、 TBL_AにID,NAMEというカラムがあって、 TBL_AのIDを2つ持った、JOIN_Aを作るにはどうすれば良いのでしょうか?
>>567 それはmany-to-manyとは呼ばないような・・・。
many-to-one×2(JOIN_A)とone-to-many×2(TBL_A)じゃね?
MySQLは、order by の対象に集計関数を使えないですよね。 from TABLE table group by table.id order by sum(table.num) というようなHQLを実行したい時はどうすればいいのでしょうか?
570 :
デフォルトの名無しさん :2005/03/29(火) 19:53:55 ID:
Hibernate 2.1.8を使用していますが、 select date(T.d) from hoge T とすると、undefined alias: date と出るのですが、SQLの関数を使用するには どうすればいいのでしょうか。 データベースはPostgreSQLです。
571 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 00:09:01
Hibernate3 リリースaget
572 :
デフォルトの名無しさん :2005/04/03(日) 00:07:28
hibernateでone to one の複合キーのリレーションがある場合にselectできないんですけど、 どなたか解決方法ご存知のかたっていmすでしょうか?
573 :
デフォルトの名無しさん :2005/04/04(月) 20:32:00
>570 hibernateは柔軟性無さ杉。 そういうクエリーには対応できないぞ。 素直にJDBCかDbUtils使え。
574 :
デフォルトの名無しさん :2005/04/04(月) 20:35:23
>572 それもできないよ。 one-to-oneでもone-to-manyでもそうだけど、リレーションしたい場合は 単一キー同士にしないとできんぞ。 でも、リレーション無くてもいいなら複合キーのマッピングできるという、わけわかんねぇ仕様。 オレもこれで悩んだんだけど、結局テーブル設計し直すことになった。
575 :
デフォルトの名無しさん :2005/04/04(月) 20:42:28
Torqueみたいにカラムのマッピングだけしてくれて、後は自分でListなりMapなりを メンバーに追加できる仕様だったらよかったんだけど、 hbm2java.xmlを再実行すると上書きされちゃうし、かといって、hibernateが吐き出した クラスを継承してメンバー追加したクラスを実行時に渡すとエラーになるんだよなぁ。
>>574 すみませんおしえてください。
いままで何度かこのスレでも、Hibernateと複合キーの話題が出てましたが、結局
Hibernateで複合キーってのが現実的に使えるのかどうか分からずじまいだったのですが、
つまり、Hibernateでは、単一テーブルからデータを取ってくるだけなら複合キーでも
問題ないけど、リレーションを使おうとすると複合キーは使えないということなんでしょうか?
577 :
デフォルトの名無しさん :2005/04/04(月) 22:09:54
>574 >つまり、Hibernateでは、単一テーブルからデータを取ってくるだけなら複合キーでも >問題ないけど、リレーションを使おうとすると複合キーは使えないということなんでしょうか? そう。取ってくるだけなんて現実的にありえないから、全テーブル単一キーで設計するしかない。 この時点でかなり萎える。。 反論はあるだろうが、あいにくオレはDB屋なので。。スマソ。 ORマッピー自体は賛成だが、現時点でのhibernateは使いづらいだけ。 Toque+DbUtilsの方が使いやすいし、柔軟性もあるので、オススメする。
> 全テーブル単一キーで設計するしかない。 > この時点でかなり萎える。。 ここと > あいにくオレはDB屋なので。 ここのつながりがよくわからんのだが、そういうもんなの?
579 :
デフォルトの名無しさん :2005/04/04(月) 22:18:31
つーか、複合キーの方が都合いい場面があるだろ。 そういう場合でも単一キーを強制される。 たかが1ライブラリの都合でテーブル設計の選択肢が狭められるのがイヤなんだよ。
複合キーの方が都合いい場面を知らないので、一例プリーズ
いや、複合キーで作られたDBが先にあって、それを使ってアプリケーションを組まないといけない ことのほうがおおい。今までもそういうことが多かった。 複合キーの善し悪しについては議論があるだろうが、なんだかんだ言っても複合キーは、 O/Rマッパーに比べて歴史の長いRDBMSではメジャーな手法で、DB屋はほぼ確実に複合キーを 使ってくる。 それを無視して「複合キーなんて旧世代の習慣だ。これからは代理キーだ」といったところで、 世の中が追いついてないんだからしょうがない。そんな世の中でHibernateが複合キーに 対応してないというだけで「DB構成変えるわけにはいかんので採用できんね」とかなってしまう のは、実情にあわせてないツールの方に問題があると思うな。 最もこれは、Hibernateに限らず、Cayenneはもちろん、EOFですらそうなんだけど。 iBatisはSQLマッパーなんでなんとかなりそうだけど。
582 :
デフォルトの名無しさん :2005/04/04(月) 23:51:46
まぁ、複合キー使えないのはTorqueもそうなんだが。 それよかhibernateで困るのは、生成されたPOJOにListとか勝手に追加できないこと。
それより、
>>579 のいう複合キーの方が都合いい場面というのが知りたい。
> 生成されたPOJOにListとか勝手に追加できないこと。 そうか?Middlegenの制約じゃねえの?
Middlegenの自動生成が上書きするからという話だったら、ジェネレーションギャップパターンを使ってマッピングするような指定ができたはず。
586 :
デフォルトの名無しさん :2005/04/05(火) 06:07:42
>585 例えば、EmpテーブルをマッピングしたEmpクラスがあったとして、 以下のような取得方法になるよね。 List list = session.createCriteria(Emp.class).list(); そこで、EmpにListとかMapとか追加したMyEmpをEmpクラスを継承して作って List list = session.createCriteria(MyEmp.class).list(); ってやると、hibernateでエラーになるのよ。 これってジェネレーションギャップパターンで解決できるものなの?
>>586 そのMyEmpはどういうマッピング定義にしてるの?
588 :
デフォルトの名無しさん :2005/04/05(火) 09:49:52
Middlegen->hbm2java というボトムアップやってるんだが。 generation gap パターンが使えるなら知りたい。 今は、パッチのカタチで保存することでなんとかやってるけど、めんどくさい。。。
一度生成したファイルは生成しなおさないようにすれば? カラムの変更があったときにはhbm.xml直書き。
590 :
588 :2005/04/05(火) 14:22:59
hbm.xml は修正点少ないんで、それでもいいんですが・・・ hbm.xml にも一応、CDATAでコードかけるんですけどね。 エディットがしづらいので・・・
hibernate3出たのにまったく盛り上がらないね。ツール待ち? どっかに変更点まとめたサイトとかありませんか?
Spring待ちだな。
>>588 ドキュメントに書いてあったような気がするが。
594 :
デフォルトの名無しさん :2005/04/07(木) 09:07:02
Hi3での大きな特徴って何?
パッケージ名が変わった。
>>586 と同じことで悩んでいるんですが、
同じ例でいうんであれば、
session.save((Emp)myEmpObj);
ってやると、
net.sf.hibernate.MappingException: Unknown entity class
になっちゃうんですけど。
結局これってできないんですか?それともhbmでなんとかなるの?
hbmさえ書けばどうとでもなるよ。 MyEmpのインスタンスを保存したいときはEmpだけじゃなく ちゃんとMyEmpについても書かないといけないぞ。
>>597 おぉ、サンクス。
>MyEmpのインスタンスを保存したいときはEmpだけじゃなく
>ちゃんとMyEmpについても書かないといけないぞ。
ってことは、
Emp = empテーブルのマッピング以外に、
MyEmp = empテーブルのマッピングを書くってことかしらん?
すまんが、どうやって書くのか例を示してもらえないだろうか?もしくは、ココみろ(URL)!でもいいので。
おながい。
>>597 とりあえず、自分でやってみた。
MyEmpのDocletで、親クラスと同じテーブルを指定してやったら、hbmのファイルができました。
DBへのアクセスもOKでした。
/**
*@hibernate.class table="emp"
*/
public class MyEmp extends Emp {
}
で、一つだけ気になるんですけど、一つのテーブルに対して、複数のマッピングってOKなんですかね?
(この場合だと、Empと、MyEmp)
インスタンスキャッシュとかしないんでしたっけ?
>>598 継承を使うなら、ちゃんと継承のマッピングをしないといけない。
Strategy of inheritとかそんなところで解説されてる。
継承のマッピングについては、過去レスにもある気がする。
Hibernate使う際に、 1:DBを先に設計・実装してからそれをマッピングするJavaコードを起こす 2:Javaコードから、XDocletなどで対応するDB構造のSQLを生成しDB実装 という2つのアプローチがあると思うんだけど、 特に後者はメリットあるかな? インピーダンスミスマッチが防げる気はするけど、DBは単なる箱になりそうな気もする。
そのためのORマッピング。Oが先。
Oを意識して、R優先。
ROマッピングってゆえ、っていう主張もあるね。
なんだかんだでシステム開発の要はデータベースだったりするので、 Rが先にあって、でもOではこういう構成になってた方が使いやすい というのがその次にきて、リレーション関係で解決できる部分は ORマッピングで対応して、リレーションだけではどうにもならない、 複数のエンティティが絡み合っているようなものはドメインモデルで 解決、という感じかな。
ORマッピングが出てきたときには、オブジェクトデータベースみたいなことをRDBでやりたいなぁって感じだったんだろうね。 オブジェクトをそのままRDBに突っ込めますよと。 実際には、RDBの制約やら設計のやりやすさの方が強かった。
Hibernateとかって、複数のデータベースに対応してるの? というか、複数データベースに対応してるORマッピングってあるのかな?
EOFかな。商用だけど。
Cayenneもサポートしてるよ。 まあ構造がEOFと一緒だし。
JDK5で generics が導入されて、バグ防止のためにも出来るだけ使いたいんですが、 Criteria.list() で取った List を DeapCopy せずに上手いこと typesafe な 別変数に入れたり戻り値として返す方法ないでしょうか? キャストしただけだと警告出ますし。 具体的には、↓みたいな。 Criteria criteria = session.createCriteria(Hoge.class) ; List<Hoge> hogeList = criteria.list() ; // ここで警告が出ます return hogeList ; // List<Hoge>を返したい なんか、OR固有の話題ではないような気もしますが。。。
611 :
610 :2005/04/28(木) 16:55:40
あ、すいません。使ってるのは Hibernate3 です。
hibernateのライブラリがgenericsで書かれていないかぎり警告が出るのはしょうがない。
>>612 キャストはできるだろうがコンパイル時にチェックできないよという旨の警告が出るはず。
614 :
デフォルトの名無しさん :2005/04/30(土) 12:57:19
質問です。 参照系はHQLではなく、SQLに近い形で作ることが createSQLQuery("SQL文");できます。 更新系(update,delete,insert)はSQLできますか? 用途は、たとえば、1万件のデータを一括して変更・削除する場合などです。 よろしくお願いします。
hibernate使う意味あんのか?
ほかをHibernateでやってたらHQLでやりたくなるんじゃねぇ?
Hibernate3 + Java5 で、マッピングにEnum使えない様なんですが、あってますか? 色々調べたんですが、マッピング用に UserType みたいなクラスを作る必要があるみたいで。 (そうするとVARCHARにマッピングしてくれるみたいな記述はみつけました) Enum使ってコードをシンプルにしたいのに、これじゃ本末転倒。 DBからロードしてきて String → Enum→画面(IDとかで使う) 画面からパラメータもらって String→Enum→(DB格納のために)String あまりにもアホらしいんで、この辺りが解決するまで Enum 使うのやめようと思ってるんですが、 先輩諸氏のご意見が聞ければ嬉しいんですが。
618 :
デフォルトの名無しさん :2005/05/04(水) 06:56:00
>614 hibernateからconnection取得してJDBC経由で行う。
619 :
614 :2005/05/06(金) 11:10:12
>615 >616 >618 ありがとうございます。 hibernateからconnectionを取得してみます。 これから調べて試行錯誤します。
>>619 net.sf.hibernate.Session#connection()で取得できると思うが。
勘違いしてたらスマソ。
622 :
619 :2005/05/12(木) 15:25:23
>620 >621 アドバイスありがとうございます。 残念ながら取得することができませんでした。 実際のプログラムとしては、 Connection connection = <hibernateのconnection取得メソッド?> Statement statement = connection.createStatement(); というような流れになるでしょうか? 621様の net.sf.hibernate.Session#connection() が利用できませんでした。(#の意味を推測してみましたが、理解できず申し訳ありません。) よろしくお願いいたします。
>#の意味を推測してみましたが、理解できず申し訳ありません。 チョットワラタ
>>622 なんかほのぼのしていいな。
# は「の」もしくは「クラスの」と訳して読み替えてみるべし。
>624様アドバイスありがとうございます。 #をのに読み替えてプログラムをつくってみました。 該当箇所でエラーが出てしまいました。(eclipse3,hibernate2) 初心者スレではないのは十分承知しておりますが、 相談できるところがないので、よろしくおねがいします。 hibernateでSQL文をつかってデータの一括更新を行いたいのです。 import net.sf.hibernate.*; import java.sql.*; (1) Session session = new Session(); <--エラー:Sessionクラスは具象クラスではないとのこと。 Connection connection = session.connection(); (2) Connection connection = Session.connection();<--エラー:メソッドconnection()はスタティックではないとのこと。 なお >58 >59も参考にしましたが同様にうまくいきません。 皆様のお力をおかしください。
.
>>625 ついでだから
とりあえず(1)はこれで
// セッションファクトリーの作成
SessionFactory sessionfactory = config.buildSessionFactory();
// セッションオープン
Session session = sessionfactory.openSession();
次に(2)
上で取得したsessionインスタンス使って
session.connection();
>>625 Hibernateより前にしっかりJava自体を勉強したら?
それからでも遅くないと思うよ。
630 :
625 :2005/05/13(金) 15:27:22
みなさまありがとうございました。大変たすかりました。 自分のjavaの知識の浅さを認識しました。 基礎をしっかり学んでみます。
なんだか心が洗われるスレだなあ。
>>629 面白いな。
使わないと思うけど、いいかも。
633 :
デフォルトの名無しさん :2005/05/17(火) 11:11:24
1つのクラスにJDBCでSQL直書き、現状5000行まで来ました。 このクラスを見るたびに吐き気がします。 型を変えたり、列を追加したりするたびにエラーの雨嵐。 列を削除したらりざるとせっとの値がずれてエラーノアメフラシ Hibernate使えば少しはマシになりますか?
>>633 その前に、テストクラスを作れ
クラスを分割した方がいいのかも。
>一個のクラスに5000行 >列を変えたり >削除しただけで値がずれる どれもORまっぱー以前の話じゃん。 そこら辺なんとかしなければ使っても変わらない。
>型を変えたり、列を追加したりするたびにエラーの雨嵐 とゆー事態は多少はましになるかも知れんが 導入したら導入したで別の問題(パフォーマンスだとか)が発生してグダグダになるのが目に見える
637 :
デフォルトの名無しさん :2005/05/17(火) 12:01:08
皆さんありがとうございます。 どのように分ければ多少マシになるのか教えていただけませんか? 今は検索も追加も更新もDBにアクセスするものは全てそのクラスに入ってます。
とりあえず用途別に分けたら? どうせstaticメソッドばっかりだろ? インスタンスメソッドだったとしても、せいぜいインスタンスフィールドはコネクションだけ、みたいな。
ORマッピングはマッピングであってラッピングではないから、きたないプログラムはきたないままだよ。
O/R マッピングの前に DB の正規化とかソフトウェア設計とか、先に学ぶべき ことが多いように思う。 分かってる人間が楽するツールであって、基礎がなってない人間が使っても 意味がないよ。
皆さんどうもありがとう! そうですよね。今はプログラムやDBの質をあげることに精進します。 ガンバルゾー!
・・・その後、>641の姿を見たものはだれもいない
643 :
デフォルトの名無しさん :2005/05/17(火) 15:50:25
641なんですが、私は前述した肥大クラスにSELECT、UPDATE、INSERT全てを入れています。 SELECTの場合はResultSetから取得したデータをBeanに詰めて返して、 UPDATEやINSERTに関しては、SampleBeanを引数として渡し、 そのgetterを使って "INSERT sampleTable SET " + SampleBean.getXxx() とか言って(テーブルと同様のjavaBeanを作って受け渡しをしている)やってます。 このソースを今度1歳になる姪っ子に見せたら泣いてしまうくらいで、ホントに困っています。 なんかコーディングのヒントだけでも教えていただけませんか・・・
その肥大化した一つのクラスは何テーブル相手にしてるの? 1テーブルしか対象にしてなくて5KL?
>644さん マスタマップも含めて20テーブルくらいです。
SELECTの結果をシンプルにBeanに詰め直すだけなら、 CommonsのDBUtilsとか使うと少しは綺麗になるかな。 ただ、INSERTとかでBeanからの取り出しは出来なかったはず。 DBの設計に問題が無いんであれば、とりあえず SELECT・INSERT・UPDATE単位なり、Table単位なり、 作業目的単位なりでクラスを分けてみては。 無駄なところ、共通する部分が見えてくるかもしれんので。
>>645 まずはテーブル毎にクラスをわけろ
一つのクラスに入れとく意味がない
ほとんどORMの話題ではなくなってきてるが・・・つかJavaの話題ですらないな
あえてJavaの話題にするなら、テーブルカラム名とbeanのプロパティ名が完全一致なら
プロパティリストをとって何も考えずループとか。
完全一致じゃなくてもアノテーション使えばいいか。
もっとも
>>633 はそれ以前の話題と思われ。
どっかに一つのアプリが一つのクラスに入ったソフトみたいなブログを見た記憶があるが、それに近いな
皆さんどうもありがとうございます! 今から用途別やテーブル毎で分けてみます。 スレッド違いなのにいろいろ教えてくださってありがとうございました。 2chでこんなにやさしくしてもらえたのは初めてです。 生まれ変わったら俺もみなさんのような教える側の人間になれるようにがんばります。
いや、生まれ変わる前に教えられるようになりなよw ある程度機能や目的別にクラスが整理できて、やってること同じでつまんねと思ったら ORMに進めばいいことがあるかもよ。ガンガレ
デザインパターン勉強しる
Hibernateの質問〜 HQLを動的組み立てるのはどうやればいいでしょうか? 普通に文字列結合して後でパラメータ設定するとソースがかなり汚くなる手間もかかる。 あとgetNamedQueryで取ってきたものに検索条件を追加できないでしょうか?
俺もhibernateの質問〜 User -> Groupが<many-to-one>の関係にあるときに、HQLで 1."from User as u"でfindすると、Userクラスのコレクション(List)が帰ってくるんだけど 2."from User as u inner join u.fkGroup" だと、Objectのコレクションが帰ってきちゃいます。 1.のHQLだと、 "select xxx from user"と、userの検索結果に応じた複数の"select xxx from group where id=?"が SQLとして投げられ、 2.のHQLだと "select u.xxx, g.xxx from user as u inner join g on u.fk_group = g.id"の一発でになるんですけど。 2のHQLで、Userのコレクションが帰ってくるようにするにはどうしたらよいの? おせーてください。
inner join fetch そもそも2で帰ってくるのは (UserとGroupの配列) のリスト なのはわかってるのか?
>>654 ありがとう。さんきゅーです。期待通り(2のHQLで、Userのコレクション取得)の動きになりました。
>そもそも2で帰ってくるのは (UserとGroupの配列) のリスト なのはわかってるのか?
はい。そのつもりです。
すみません。追加で聞きたいのですが、Session.get(User.class, id);で、やった場合
やはりSQLが2回発行されちゃうんですけど、getの場合でもjoinする方法ってありませんか?
ちなみに、2つのクラスは以下のようになってます。
class User {
String id;
Group fkGroup;
String username;
}
class Group {
String id;
String groupname;
}
hibernateの設定ファイルでuse_outer_joinをtrueにしたり max_fetch_sizeを適当に大きくしたりする。 あるいはmany-to-oneとかの属性でouter_joinをtrueにする。
select * from cats みたいな感じで、{}で別名の定義をしていないSQLは、Hibernate2.x系でも3.x系でも、 createSQLQueryで使うことはできない。 …あってる??
やってみれば?
いや、エラーがでることは確認したんだけど、回避する方法あるのかなと思って。
660 :
デフォルトの名無しさん :2005/05/22(日) 21:27:08
>657 できない。
662 :
デフォルトの名無しさん :2005/05/22(日) 21:52:21
Hibernate3.0では、生SQL実行が充実されてるって聞いたけど、 具体的にはどんな感じなの?
>>662 そんな不良みたいな口の利き方おやめなさい
なんか過去に戻って歴史を変えてしまった瞬間に 立ち会ったような気分だ
いみふめ。 おまえ、心が不健康だな
>>668 すまんな、665がネタをふってくれたもんでな。
あーそうか。 ガンヲタが不健康ってことね。 そりゃ反論出来ません。
>>664 まだ見てないけど、生JDBC使えるのかな?
とりいそぎdクス
672 :
デフォルトの名無しさん :2005/05/27(金) 14:14:42
iBATISの実行SQL文のログ出力で 構文エラーがおきてもそのSQL文を表示するにはどうすればインでしょうか
673 :
デフォルトの名無しさん :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に 設定したく・・・
死んだか...
676 :
デフォルトの名無しさん :2005/06/01(水) 23:01:48
正規化と多様性 保守とパフォーマンス
Torqueって使ってる人いる? 禿げしく役に立たない気がするんだが。 仕事なんで仕方なく使ってるけど。
かわいそうに・・・
一時期けっこう話題になったが開発止まってるからな・・・。 止まってる理由が理由だけにしょうがないけど。
理由って何?
開発者が亡くなったらしい
682 :
デフォルトの名無しさん :2005/06/05(日) 13:20:08
つーか、そもそも存在意義がわからん。>Torque ObjectとRDBのギャップを減らすんじゃねーのかよ。 SQLは隠すけどテーブル隠さないなら 頭隠してチンコ丸出しじゃねーか。
ORマッピングツールである以上、テーブルの情報は 欠かせないよ。 とりあえず決まりきったコーディングを一律に自動生成する ことによってエンバグを防ごう、って感じじゃない?
アパッチはOJBってのもかかえてるし、iBATISも 寄贈されたんだっけ? これにTorqueまで あったら多すぎ
>>683 いや、ソースコード上でテーブルをモロに
意識しなきゃいけないのがダメダメってこと。
複数のテーブルから一つのオブジェクトを
作りたい場合なんかだと、Torque は全く使い物にならん。
だから仕様変更で他のテーブルの情報が必要になったとき、
JOINであっさり解決する所もTorque様のおかげで
ソースコードを相当直さなきゃならんかった。
これもTorqueの「Entityとそれにアクセスするクラスが継承関係で
ぎっちり結びついてる」、なんていう、古すぎる設計のせいだな。
使うなら他のFrameworkをお薦めする>諸氏
Hybernateもためしに使ってみたが、まぁまぁよさげ。学習コストがちと高いが。
>とりあえず決まりきったコーディングを一律に自動生成する
>ことによってエンバグを防ごう、って感じじゃない?
それはそうだろう。
が、IDEが進歩したり、テストのFrameworkを使うようになったから
コーディングスタイルの強制でエンバグを防ぐためのコード自動生成って
いうのは以前より意味が薄くなってきてる感じがする。
>>685 大事だが、プログラマとして振舞う時は隠しとけ、って事かな。
>>686 Hibernateはアノテーションと一緒に使うのがよいですよ。
まだベータだけど期待大。
>>687 EJB3.0もそっちの方向だよね。
なんか乱立気味だ。
ていうかクレイグがEJB3.0のスペックリードだっけ?
Hibernateのアノテーションは、EJB3と共通だよ。 クレイグはStrutsの人で、JSFのスペックリード。
オリはよう ひきこもりサンデーPGだからよう 自前のXML->SQL,JavaBeanジェネレータとか作って遊んでただ でもよう、ひきこもってたら米がなくなってよう こんなオリにおすすめのO/Rマップを教えてくれよう
>>689 ごめん、クレイグはWebの人だったね。
Hibernateはグラビンだったかな。
うわぁ、
>>695 のリンク先見たけどiBATISクリソツ・・・
現在メモリ節約の関係でiBATIS使いなんだけど、
Hibernate3に乗り換えようかと悩んでしまうよ。
横レス失礼
>>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のマッピングで、とか。
698 :
695 :2005/06/13(月) 11:18:47
>>697 dクス!
>とするとq.list()としたときにList<Object[]>が得られる。はず・・・。
>[0]がt_sssのマッピングで[1]がt_tttのマッピングで、とか。
ってことは、[0]に入っているt_sssのマッピングから、実際のマップされたオブジェクトの
配列だかコレクションだかを取り出してやればいいってことですかいな?
699 :
デフォルトの名無しさん :2005/06/20(月) 15:49:36
ORマッピングってテーブル間の関連もオブジェクト化するんですよか? たとえば、注文テーブルと注文詳細テーブルみたいなのがあって 1対Nの関係になってるとき オブジェクト化するということは 注文テーブルのクラスは class Chumon { private List syousai; //Syousaiクラスのリスト } のようにコンポジット構造にするってことですよね? 注文詳細テーブルのクラスは注文テーブルのクラスありきで使用する 見たいな感じで ここまであってるでしょうか?
するんですよ。
>>700 うう、すみません。
ところで、あってるということでしょうか?
とりあえず質問していきたいと思います。
私の気になっているところはどの時点で関連をばらしてしまうのか?ということです。
DAOクラスを作る場合
各テーブルごとのDAOクラスを作成していますが
そのばあい、注文のDAOは
calss ChumonDao{
public void insert(Chumon chumon);
}
注文詳細のDAOは
calss SyousaiDao{
public void insert(Syousai syousai);
}
のように作成しています。
DAOに委譲した時点で既にテーブル間の関連はなくなっているので
DAOを呼び出すビジネスロジックで関連をばらしてあげる
という感じにしました。
このやり方って間違ってますか?
ビジネスロジックのソースはこんな感じです 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); } }
703 :
デフォルトの名無しさん :2005/06/20(月) 20:11:31
>>701 O/Rマッピングにも色々あるが関連を作れるものが殆どだと思う。
んで、DB一行一オブジェクト的DTOと、domainオブジェクトは
別なものだと分けて考えた方がいいと思うよ。頭の中でそれが
混在してるとヤバい結果に繋がる。その上でトランザクションの
範囲とかをキチーリ把握して。
例えば;
>DAOに委譲した時点で既にテーブル間の関連はなくなっている
Chumonを更新完了した後でSyosaiの更新が落ちたらどうする?
704 :
703 :2005/06/20(月) 20:18:37
補足: 君がもしChumonDaoでcommitをやってるなら 君のソースは屑です。 AOPの宣言的トランザクション等を利用するなら 君のソースは使えます。
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に指定したら動くようになったが、 (例の構成ではそうでもないが)更新ができないようではやはり少々不便なので、 何か解決法はないのでしょうか?
>>705 設定の失敗をHibernateのせいにしないこと。
おかしいだろ。
> Repeated column
はやっw 見直したら確かにcolumnを勘違いして、対象テーブルのカラムを入れのが原因だった。 ありがとう&吊って来る。
何を何で吊るというのか?
回線でお前の首を。
710 :
デフォルトの名無しさん :2005/06/30(木) 22:52:54
Hibernateを使用したWebアプリをスタンドアロンのPCで Tomcat上で動作させるとMappingExceptionがでるんですが、 解決方法ありませんか?
トランザクションとコネクションプーリングについて少々質問。 //前処理(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したほうがいいですか?(コネクションの種類が変わると動作も変わるってのもあれなので)
すいません、↑だがテストのミスでした。 DBCP使っても結果は変わらない。 うむ・・いつ、どの層でどうrollbackさせようか・・・・
714 :
デフォルトの名無しさん :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"が帰ってくる ご存知の方、教えてくださいまし・・・
>>714 >SpringとHibernateをTomcatで、組み合わせて使っているんですが、
問題の切り分けは出来ているのか?
取りあえず考えられる要素として、
1.Springの設定ミス。
・beanのsingleton属性を設定していない場合、Springから得られるbeanのインスタンスはアプリケーション内で共有される。
ちなみに手元にあるJavaWorld 2005/01 の Struts + Spring + Hibernateの特集ではsingleton属性はfalseに設定してあった。
2.DB関連のミス
・DBに送信されたクエリやテーブル/ビューの状態等。
3.セッションのスコープ範囲のミス
・セッションのスコープがapplicationスコープになっている等。
716 :
714 :2005/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さんで違うので。
よろしくお願いします。
本当にDBは更新されてないのか?
>>717 すまぬ・・・
DBが更新されていた・・・すまん。
ただ、DB更新するコードは書いてなくいんだけど(つもり)、Entityの内容が変わると
トランザクション終了時にUpdateが走ってしまう。
うーん。そういうものでしたっけ?
DBが更新されてなくても、コミットしたならキャッシュにも反映される。 そうじゃないと、困る。 ってか、コミットしたときに永続化しないのなら怖すぎっていうかコミットにならないと思う。
>718 flushしたからじゃない?
721 :
デフォルトの名無しさん :2005/07/13(水) 12:07:18
>>719 ん?ちょっと教えてください
Hibernateから取得したEntityは、sessionのSavaとか呼び出さなくても、Entityに変更が入ったら
DBの更新されちゃうんですか?
ちなみに、Springとの組み合わせなので、トランザクションの管理は、Springまかせですが
>>718 明示的にしている部分はないんだけど、auto_flashなモードとかってあります?
デフォルトでcloseするときにSQL発行するんでなかろーか flush()なんてメソッド使ったことないし
>>714 キャッシュされた同じオブジェクトが帰ってきてるだけかと。
Hibernateは取得したオブジェクト変更したら 勝手に最後にupdateしちゃうぞ
ま、理由はどうあれ、
>>714 はただしい動作だな。
そこで値が異なることを期待するほうがおかしいと思う。
726 :
714 :2005/07/13(水) 16:39:37
みなさんレスありがとさんです。 やっぱり最後にUpdateされるのは仕様ですか、そうですか。 あれ?ってことは、わざわざ save()とか呼ばなくてもいいってことですか? 昔、EntityBeanを使ってWebのアプリケーションを組んだときには、 EB直接編集すると、それこそトランザクションコミットした際にアップデートされてしまうので、 編集する際には、EBから、Value Object(今はDTO?)を取り出して、 編集はそのDTOに対して行って、最後にそのDTOをEBに戻して、 DBアップデートみたいなことをしてたんですけど。 Hibernateも同じ考えなんですかね?cloneして使うとか、かな? こんな場合みなさんどうしてるんですか?できれば教えてほしいっす。
>724 flushしない限りは発行しないよ。
>>726 > あれ?ってことは、わざわざ save()とか呼ばなくてもいいってことですか?
save()はSQLのINSERT相当です.
更新はHibernateセッションのflush()時に勝手にやってくれます.
> 昔、EntityBeanを使ってWebのアプリケーションを組んだときには、
略
> Hibernateも同じ考えなんですかね?cloneして使うとか、かな?
永続オブジェクトを取得したHibernateセッションを閉じてしまえば
そのオブジェクトは「Detached」な状態となり,変更してもDBには
反映されません.
それをDBに反映する際にはSession#update()を使います.
>>727 > flushしない限りは発行しないよ。
明示的にFlushMode.NEVERにしない限り,トランザクションのコミット時などに
flush()自体が勝手にされます.
730 :
714 :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してやろうかと思ってぞっとしてました。 あー、すっきり。ありがとうございました。助かりました。
> 一時は真剣に、DAOから取り出すEntityは、 > すべてcloneしてやろうかと思ってぞっとしてました。 ぞっとするくらいDBに格納しない変更があるのが理解できんのだけど。 それに、同じオブジェクトが取得されてたら、DBが更新されたかされてないかにかかわらず、変更が伝播するよ?
732 :
714 :2005/07/15(金) 14:13:17
>>731 あ、意味が通じてなかったっすね。
>ぞっとするくらいDBに格納しない変更があるのが理解できんのだけど。
いえいえ、Entityに対する変更はかならず、DBに反映されて欲しいのです。
ただ、タイミングが問題で、というだけ。
入力画面->確認画面->結果画面があるとして
入力->確認でユーザの入力によってEntityは変更(確認画面表示のために)するけど
まだDBには反映させたくない。だって、ユーザが確認画面で「やめた」って、する場合もあるので。
>それに、同じオブジェクトが取得されてたら、DBが更新されたかされてないかにかかわらず、変更が伝播するよ?
うん。これは理解しているつもりなんだけど。なにか
>>730 の書き方変だったかしら?
>>732 Hibernateから取ってきたものはDBの写像なので、ユーザー入力とは別に扱うべきだと思うけど。
とってきたエンティティの更新タイミングやキャッシュのされ方が気になるような設計は、あまりいい設計だとは思えない。
734 :
714 :2005/07/15(金) 17:19:43
>>733 >Hibernateから取ってきたものはDBの写像なので、ユーザー入力とは別に扱うべきだと思うけど。
>とってきたエンティティの更新タイミングやキャッシュのされ方が気になるような設計は、あまりいい設計だとは思えない。
うんうん、そのとおりなんだよね。おっしゃるとおりだと思います。
そこで、
>>726 の話に戻っちゃうんだけど、みなさんはどうしてるんでしょう?
HibernateのEntityの状態には2種類あって、detachな状態と、attachな状態。
detachな状態のEntityを更新しても自動的にDBには反映されないけど、
attachな状態のEntityを更新した場合には、反映されてしまう。
同じオブジェクトを操作しているにもかかわらず。
これを開発者が意識しないで、コードを書くようにするためにはどうしてます?
やっぱり、DAOからEntityを取り出す時に、DTOなりに値をコピーして取り出すんでしょうか?
Sessionから取り出す時にすぐにdetachにすることができれば簡単なんだけど。できるんかしら?
悩ますぃ。
Session#evict()
736 :
デフォルトの名無しさん :2005/07/16(土) 14:19:40
> >574 >>つまり、Hibernateでは、単一テーブルからデータを取ってくるだけなら複合キーでも >>問題ないけど、リレーションを使おうとすると複合キーは使えないということなんでしょうか? > >そう。取ってくるだけなんて現実的にありえないから、全テーブル単一キーで設計するしかない。 >この時点でかなり萎える。。 かなり前の話ですまんす。 これって本当にできないんですか?試してみたら問題なくできているようなんですけど。 ちなみに hibernate3 使ってます。3から変わった? 複合キーをできれば避けるべきなのは同感だし、マニュアルにも避けろと書いてあるけど、 複合キーをやむなく使う場合、結局、どんな問題点があるんでしょう?
結局勘違いだったっていう結末だったと思うんだけど。
素直にSQLバリバリ書いたほうがトータルコストは安いというのが結論?
ぜんぜん。
微妙にスレ違いになってしまうかも知れませんが SQLiteのような鯖を経由しないRDBで、ピュアJavaのものはありますでしょうか?
鯖を経由しないってのがどんなもんかしらんが。 HSQLDBやらDerbyやらCloudscapeみたいなもんか? Derby=Cloudscapeね。
>>741 組み込み系と呼ばれるホスティング専用のプロセスを立ち上げないDBMSです。
HSQLDBはスタンドアロンモードが組み込み用に用意されてるみたいですね。
でも3MBってのはちとでかすぎですかね。
SQLiteは242KBのDLLだから配布しやすいんですよね・・・
JNI経由でOS毎にDLL作ったほうがよいのでしょうか。
マナー違反?
745 :
デフォルトの名無しさん :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です。
書いてある通りだと思うんだが
747 :
デフォルトの名無しさん :2005/07/19(火) 14:22:00
>>746 さん、どうやって解消したらよいかご存知でしたら教えてもらえませんでしょうか?
よろしくお願いします。
答えようかと思ったのだが、おれは746ではないし。
>>744 もうJNIで実装はされているのね。
あんがと。ネイティブで頑張る。Win/Linux以外はユーザに作らせる。
>>748 さん、
>>746 さんそれ以外の方々もご存知でしたら何卒ご教授願いますようよろしくお願いいたします。
ふつうにfindしたオブジェクトを変更してupdateしてるけど・・・
>>745 の人が
>>728 の人と同じ人なら、
>>733 という意見なので、ごちゃごちゃイレギュラーなことの対応のために頭使うのはバカらしい、ということで。
>>753 > ふつうにfindしたオブジェクトを変更してupdateしてるけど・・・
そのfindとupdateが同じセッションならupdateはムダ
>>745 はセッションAでfindしたオブジェクトを変更してセッションBでupdateしようって話
そのセッションBでもfindしてるから例外になる
>>754 >> ふつうにfindしたオブジェクトを変更してupdateしてるけど・・・
>そのfindとupdateが同じセッションならupdateはムダ
そうなのよね、同一セッション内ならFlushで更新されるからupdateは無駄なんだよね。
でも、ちまたのサンプルだと同一セッション内でもupdate呼んでる例が多い。まじめに勘違いしてた。
>>733 な意見なのはよくわかるんだけど、どうやってるの?
設計段階、もしくはコーディングのルールとして開発者が「意識して」オブジェクトの内容を
変更しないように気をつけているの?
それともなにか別の仕組みとして、開発者が意識しなくても制御できるようになっているの?
誰かおせーて。
必要なモノ取り出したらSession閉じればいいじゃない
>>755 マッピングオブジェクトへの変更は、DBの変更のために行う。
マッピングオブジェクトを変更したときにDBが変更されないように「意識して」設計したりしない。
758 :
デフォルトの名無しさん :2005/07/26(火) 03:50:15
Hibernateでの質問です。 DAOレイヤーのオブジェクトをビジネスレイヤーより下の階層に渡すってのは あまりやらない方が良い事なのでしょうか? evictした後に渡すべき何でしょうか。 その辺悩んでおります。
759 :
デフォルトの名無しさん :2005/07/29(金) 22:26:39
Hibernate 3.*にXML-DataBindingの機能が搭載されているようなんですが、さわってみた人いますかー? CastorXMLみたいなことできるか?
760 :
759 :2005/07/30(土) 14:12:07
とりあえず試してみたよ。マーシャル・アンマーシャルにdom4jを使っているんだな。パフォーマンスで分が悪そうな感じがする。 マッピングファイルを使ってある程度自由なXMLを書き出すことができるのはCasterと一緒か。
外部キーについて many-to-one関連で主キーを使ってマッピングした場合は外部制約を正しく生成してくれるが、 property-refを使ったmany-to-one関連はまったく生成してくれなくて困っています。(hbm2dllで) 何かパラメータの指定で出来るのか、 それとも元々property-refでの関連では外部キーを使わないものでしょうか? (出来れば主キーにマッピングしたいところだが、 外部のデータと連携するために他のDBと一意のユニーク値で連結する必要があるので)
Hibernateについて質問です。 オブジェクト生成に独自のコンテナ(といってもSpringですが)を使っている為、 オブジェクトのインスタンス化をフックしたいのですが Interceptor.instantiateをインプリ面とすれば良いという所までは突き止めました。 しかし、この関数 id を引数に取るのですが、オブジェクトに id を設定してやらないと エラーになってしまうようなのです。しかしながら、 Hibernateを使っている方なら ご存知の通り、 id はHibernateの設定ファイルで自由に指定できます。 Hibernate自身の設定ファイルの設定に従ってオブジェクト id を設定するような インターフェースは無いものでしょうか。
763 :
762 :2005/08/15(月) 15:36:44
すいません。自己解決しました。 マニュアルにしっかりのってました。。 SessionFactory#getClassMetadata
764 :
デフォルトの名無しさん :2005/08/18(木) 19:36:33
.hbm.xml に、versionとtimestampの用途がイマイチわからない。 timestampにはoptimisticロックの「安全性の低い実装」とあるから、使うのをとてつもなく躊躇する。 じゃぁ、安全性の高い実装は何なの?と思ったり。 versionもトランザクションが長い場合に使うとあるのだが、自動的にインクリメントされるの? ロックの競合を防ぐために使われるもの?説明が足りなくてこまるなぁ。 使ったことある人、どういう用途で使ってるのか、実用的かを教えてクリクリトリス
VERSIONの場合、SQLのUPDATEを発行するたびにVERSIONにマッピングされたフィールドがインクリメント されるわけだ。 具体的にはユーザAがある列をSELECTする(VERSION=0)。ほかのユーザBが同じ列をSELECTする(VERSION=0) で、ユーザBがなにか変更してUPDATEをおこなう。このときVERSIONは1になる。さらにユーザAも何か変更 してUPDATEしようとする。しかし、自分の知っているVERSIONより新しくなっているので更新できずに例外 が発生する、というわけだ。 まぁ、WEBアプリなんかではありがちな手法だと思うが。便利かどうかはシステムの仕様次第じゃないか。 ちなみに間違ってても責任とれんので実験してみてくれ。
766 :
デフォルトの名無しさん :2005/08/19(金) 08:04:45
サンクスコ. オレ的には別に他ユーザーがupdateしちゃったとしてもそのまま上書きしてもいい感じがするんだがなぁ(初心者的発想w なんでそんな七面倒なカラクリが必要なんだろうな。
ある銀行口座にAとBが同時に一万円振り込んだ場合、 変にupdateしちゃうと二万円増えるはずが 一万円しか増えないかもしれなくて問題だろ?
>767 それはアップデートする直前にselect for updateすれば解決だから例えとしては微妙ですな。
769 :
766 :2005/08/19(金) 13:49:53
>>767 口座テーブルにAとBが同時に1万振り込むって、insert into するので、rowが衝突することが無い希ガス。
誰か漏れを上手に納得させてクリクリ.
770 :
766 :2005/08/19(金) 13:55:57
>>766 だから仕様次第。
長めのテキストの誤植を直すような時には上書きしちゃ困るし。
>766 俺が編集画面を開いて、編集している間に他の人がデータを変更したら困る場合に使う。 例えば・・・そうだな、会議室の予約とか。 先にとった人が居たのに上書きされじゃ困るよな?(まあこれも他の方法で避けられるが
見てるものと更新する先が違うとやだなぁ、って場合はある Wikiとかそーなってるよな
774 :
766 :2005/08/19(金) 14:21:12
>>771-773 週末の昼間からどうもありがd。だんだん理解してきた。
やり方にもよるかもしれないが、更新直前にselectで同じrowを拾ってきてversionみて、編集中のものと比較して
違っていたら例外、っていう感じになるのかな?
CVSのリビジョンみたいなもんだろ
776 :
デフォルトの名無しさん :2005/08/20(土) 20:54:55
いまどきこんな事も知らないでやっている奴がいたのか
777 :
デフォルトの名無しさん :2005/08/20(土) 20:56:58
>select for updateすれば解決だから例えとしては微妙ですな。 それは取得できた行のみの話なんだよな ま、わかっているとは思うけど
778 :
デフォルトの名無しさん :2005/08/29(月) 00:00:33
HibernateがJava5のAnnotationに対応したらしい。
これでHibernateでXDocletを使う必要がなくなる。
アノテーションでO/Rマッピングを記述する - Hibernate Annotator公開 (MYCOM PC WEB)
http://pcweb.mycom.co.jp/news/2005/08/19/004.html @H8Class(table="GROUP")
class Group {
@Id(generator=@Generator("uuid.hex")) private String id;
@Property private String gname;
@H8Set(
key = @Key(column="gno"),
value = @CollectionValue(otm = @OneToMany())
)
public Set<Member> memberSet = new HashSet<Member>();
}
<hibernate-mapping>
<class name="sample.Group" table="GROUP">
<id name="id">
<generator class="uuid.hex"/>
</id>
<property name="gname"/>
<set name="memberSet">
<key column name="gno"/>
<one-to-many class="sample.Member"/>
</set>
</class>
</hibernate-mapping>
Hibernate Annotationsでいいような気がするけどなぁ。 EJB3に準拠してたほうががなにかと便利だし。
>>778 価値がわからん。
>>779 の言う通り、オフィシャルのHibernate Annotationsでいいと思う。
次期バージョンEJBならば、価値が見えてくるのかな? 今までXDocletでしかできなかったことが言語使用レベルで できたことで、エラー警告情報などがJava側で確認でき 一括管理できたというメリットがあるのかな? XDocletとルールも全然違うことに驚かされる。 それよりも、Genericsが使えるようになったのは大きいかと。 推測だが、以前よりもエラーチェックが厳しくなって堅牢性が高くなったことが大きな価値のひとつにみえる。
>>781 Hibernate Annotationsは、次期バージョンEJBに準拠してるわけだが。
Hibernate Annotationsという、Java標準に準拠していてオフィシャルのアノテーションがあるのに、どういう価値がannotatorにあるのかがわからん。
annotatorはEJB3に基づいてないから最新の要求に応えられるって書いてあるけど、Hibernate Annotationsにもhibernate独自のアノテーションはたくさん含まれてるわけだし。
実際使おうと思ったらhibernate独自のアノテーションも使う。
784 :
デフォルトの名無しさん :2005/09/02(金) 17:43:04
ibatisのselectで、VARCHARをString[]にセットすることってできますか?
785 :
デフォルトの名無しさん :2005/09/02(金) 18:22:03
>>784 漏れの知識不足でなければムリポ。
beanのsetterで工夫するしかないんじゃない?
>>784 QueryWithRowHandler
Hibernate3 で質問です。(3でしか試してない) PARENT 1<-->* CHILD な関係にある二つのテーブルに対して どちらも自動採番する ID 列を持ってた場合、 (Child は non-null な Parent の ID 列を外部キーに持つ) Parent p = new Parent(); // p のプロパティ設定 Child c = new Child(); // c のプロパティ設定 c.setParent(p); --------(1) p.getChildren().add(c); session.merge(p); みたいなことをやりたいのですが、CHILD.PARENT_ID に NULL を挿入できません、と言われます。 PARENT への INSERT より先に CHILD への INSERT が走ってるらしく 1 でセットした p は DB とは関連付けられてないので PARENT_ID も確かに NULL だろうなぁと言う感じです。 こういう場合って、一度 p を保存してから、 Child を add して、また p を保存、とかってやるんでしょうか? きっと設定がおかしいだけなんでしょうけど bidirectional とか inverse とかいろいろあって どこから手を付けていけばいいのか分かっていません。
>>787 試したことないけど、とりあえず id generator は foreign を指定してんだよね。
787です。 アレからいろいろ試してみましたが、 merge() を使ってたのがダメだったみたいで saveOrUpdate() に変えたらテストが通りました。 よく分かってないので、リファレンスの該当部分を読み直してきます。 お騒がせしてすいませんでした。 >788 さん id 列は sequence にしています。(環境は Oracle) one-to-many なので foreign は使っていません。
790 :
デフォルトの名無しさん :2005/09/10(土) 14:33:00
iBATISで動作検証をしているのですが、 TomcatとOracleASで動作検証をしたところ、 SQLの実行結果に違いがでています。 (Tomcatで実行した場合はデータが取得できるが、Oracleの場合は データ件数が0件)。 原因の特定のために調査しているのですが、 例えばSAXパーサーの違いなどにより、 iBATISの動作が変わることなどはあるのでしょうか? 何か似たような症状が現れたことがある方はいませんか?
>>790 iBATISはぜんぜん知らないのだが、
発行しているSQL文はログで見れないの?
792 :
デフォルトの名無しさん :2005/09/12(月) 10:12:01
>>790 漏れはoc4j、Tomcat、OraDB、iBATIS、spring、JSFだけど
そんな症状見たことない。
つーか、トランザクション環境さえも晒さないで、答えを
得られるとでも思ってるの?
とりあえず
>>791 が書いてるようにログ見ろ。
ログレベルをdebugにするよろし。
>>790 ログ見て一緒ならトランザクション隔離レベルかな?
oc4jのデフォルトってSerializableだったりすんの?
でも、iBatisって中で相当無理なことしてる印象があるから、 多少問題が起こるのは予定調和ジャマイカ
少し質問 今hibernateを勉強してて、ちょっと思ったんけど 例えば あるテーブルAとテーブルBが1:Nというmappingはできたんだけど テーブルAとテーブルBが1:NでテーブルAとテーブルCが1:Nの場合に テーブルAのmappingでone-to-manyの書き方が、いまいち分かりにくいんですが この場合は、どう書けばいいのでしょうか?それともHQLかSQLを書くしかないのかな?
>>795 >あるテーブルAとテーブルBが1:Nというmappingはできたんだけど
をテーブルCの分も書けばいいでない?
hbmをさらしたほうがはやいかも。
hibernate-tools の変わりようが激しくて泣きそう。。
798 :
795 :2005/09/14(水) 21:30:46
>>796 サンクス、C分も書いて動きました。書いたらBもCも両方反映されるのか・・・便利かも
799 :
デフォルトの名無しさん :2005/09/14(水) 21:51:31
AとかBとかCなんて、えっちなやつらだ。
800 :
デフォルトの名無しさん :2005/09/14(水) 22:28:23
>>798 昔、通勤途中の電車で「はじめてのC」本を読んでたときの
女子高生達の冷たい視線が懐かしい。
802 :
デフォルトの名無しさん :2005/09/15(木) 00:36:16
Eclipse3.1, Hibernate3, Middlegen でしつもんさせてください 【質問1/2】 table : GRP_INFO GRP_ID (primary key) GRP_NAME table : USR_INFO USR_ID (primary key) USR_NAME table : RLM_INFO GRP_ID (foreign key -> GRP_INFO.GRP_ID) USR_ID (foreign key -> USR_INFO.USR_ID) ((GRP_ID, USR_ID)でunique) という、ユーザが複数のグループに登録できるリレーションを考えたとき、 その更新処理においてRLM_INFOのhbmを読み込む段で例外(MappingException)が出ます。 primary key がない場合はhbmを手書きでゴリゴリ修正しなければならないのでしょうか?
803 :
デフォルトの名無しさん :2005/09/15(木) 00:40:44
【質問2/2】 table : PST_INFO (役職ID, 役職名) PST_ID (primary key) PST_NAME table : USR_INFO に PST_ID (foreign key -> PST_INFO.PST_ID) を追加。 尚ここはNULLでも可で、NULLの人はニートという設定で、 GRP_ID = x に属するユーザ情報はSQLで簡単に書けますが、 hibernate的に、外部結合を含んだこのような検索はどう実装すればよいでしょう? ご協力をよろしくお願いします
804 :
デフォルトの名無しさん :2005/09/15(木) 00:46:47
select g.grp_name, u.usr_name, p.pst_name from grp_info g, rlm_info r, usr_info u, pst_info p where g.grp_id = x and g.grp_id = r.grp_id and r.usr_id = u.usr_id and u.pst_id(+) = p.pst_id ;
>>802 >その更新処理においてRLM_INFOのhbmを読み込む段で例外(MappingException)が出ます。
>primary key がない場合はhbmを手書きでゴリゴリ修正しなければならないのでしょうか?
<composite-id> を使えば ok。
でも一意なキーを作ったほうがらくかもね。
NULLにするのとニートな役職用意するのと どっちが設計的に優れてるんかな? 俺は後者の方が吉だと感じるんだが。 もっともORMとは直接関係ない話だが。
807 :
デフォルトの名無しさん :2005/09/15(木) 07:45:36
>>805 <composite-id>
</composite-id>
こんなふうに空でできています。
ここに何か入った状態で自動生成させるには、
前工程(middlegenの設定?)のどこかで何かやるのか、
これから会社いって確認してきます。ありがとうございました。
>>806 確かに設計的にはそうかも。
でもこれで巻き取り対象の旧システムは
(+)使いまくりのニートな設計なのでしたorz
>797 ?プラグインの中のjarを取り出せば、2.xの時と同じように使えるが
>808 ant タスクのパラメータとか結構変わってませんか? 2.1.8 の時の丸写しでサックリ試すつもりだったので ちょっと面食らってしまってました。 でも落ち着いてみたら大した問題ではなかったでした、、、すいません。 早くalpha取れて欲しいです。 マッピングファイルを正にしたいんで。
810 :
デフォルトの名無しさん :2005/09/19(月) 19:36:14
>>801 >昔、通勤途中の電車で「Cの達人」本を読んでたときの
>女子高生達の冷たい視線が懐かしい。
いまググッたらC言語ではなくCのみの本は
たのしいC
やさしいC
独習C
特に最後の奴は誤解を招きやすい・・・
気を付けろ!(アイツのような口調で)
811 :
デフォルトの名無しさん :2005/09/19(月) 21:19:53
漏れは親戚のねぇちゃんにゴム付きでCを教えてもらったよ。入れた瞬間に出してしまったさ'`,、('∀`) '`,、 その前におっぱいさわったら出しちゃってたから、若いってスゴイんだなと改めて実感。もう20年近く前だがな………otz この間の法事で久々にあったときはいい感じのババァになってて、コアダンプはきそうになりますた。
812 :
デフォルトの名無しさん :2005/09/19(月) 21:33:55
>>811 コアダンプをゲロの意味で使うって事はASCII関係かIIJ関係の人か?
浅香唯 C-Girl
大学生だけど普通に使うよ。
816 :
デフォルトの名無しさん :2005/09/24(土) 14:20:15
質問があります。 外部キーや参照整合制約が一切作られていない、DBがありまして、 そこからMiddlegenで、マッピングを自動生成しました。 DB上は関連が定義されていないのですが、自動生成されたマッピングを手で修正して 関連を追加してあげると、今後、自動生成できなくなってしまいます。 自動生成はしたいけど、マッピングに追記もしたい場合には、なにかいい方法はありますか?
818 :
816 :2005/09/24(土) 22:09:33
>>817 DB側の修正が、テーブルが増えるだけならいいのですが、列が増えたりすることもあるので。
考えたら、DB側は、そんなに頻繁に変更されない(はず)ので、
初回だけ自動生成して、あとは自動生成せずに、手で変更分だけ修正と割り切ってもよいような気もします。
初回の全テーブルのマッピングを作ってくれるだけでも、相当楽なので。
819 :
デフォルトの名無しさん :2005/09/26(月) 18:29:38
hibernateを利用してはいけない5つのシチュエーション
http://www.everes.net/145 ………なんつーか、完璧な道具なんてどこにもありゃしないのに文句たらたらで
具体的な回避策も示さずにいるみっともないエンジニアという感じだな。
全部が間違ってるわけではないが、その内容に従うと使えるシチュエーションのほうが少なくなる (DBの複数対応が必要な場合ってそんなに多いか?)、 しかし現実はそーなってない、その場合世間を疑う前にまず自分を疑ってみるべきだと思うがどうか
>>819 別に Hibernate マンセーじゃないけど、使えないのは Hibernate じゃなくて、
自分だという事に気が付いてないんじゃないかね。
そこに書いてある減少でハマったことはない。
822 :
821 :2005/09/26(月) 18:56:02
s/減少/現象/
>Criteria#listをするとListにとびとびにオブジェクトが入っている 2.xから3にバージョンアップした時にこれにははまったな。 あまりにも横暴な変更にワラタ
> 3もリストを毎回POJOに(しかも必要な関連のオブジェクトも含め)コピーするのは考えたくもありません。 解決策から目をそらす・・・
825 :
デフォルトの名無しさん :2005/09/26(月) 20:05:04
つかえねぇ、つかえねぇと文句言うってことは使いたい、使いこなしたいの裏返しなのかな。 多少の回避策はあげていても結局は使うな、使うなって連呼しているところに違和感を感じる。
O/Rマッピングって、一件のデータをいじくる場合に威力発揮するからHQLとかCriteriaとかあまり関係ない希ガス
4のデータベース側にロジックって・・・ hibernate云々の問題じゃないような気がする
ま、単なるグチブログにめくじらたててもね。
グチブログか・・・・・・・・それでも、デルモヲチブログよりはマシだよな。 技術力はある人なんだけどな、どうしてあぁも壊れてるんだか_| ̄|○|||
壊れてるから技術力あるんだろ
Hibernate儲必死だなw
Hibernateの思想がずれてるってのは同意だな。 4のように自動更新したりとか、EJB1,2に引っ張られてる部分が多いし、無駄機能を実装するためにわかりにい部分も多い。 ま、大体の問題はどうにかなるし、ほかにまともな選択肢は少ないけど。
何でもO/Rマッピングでやろうとするのが問題な気が・・・ 単純にテーブル単位でデータ持ってきて更新ってときは便利だし それ以外はDbUtilsあたりでいいやと思ってるのだが
デルモヲチブログテラワロスwww
>>824 > 3もリストを毎回POJOに(しかも必要な関連のオブジェクトも含め)コピーするのは考えたくもありません。
> 解決策から目をそらす・・・
そこでDxOですよ
つうかこれでトラブるってことは、引っ張ってきたオブジェクトを
(RDB上のデータを更新する意図がないのに)触ってるってことだよな。
1000→1,000みたいな(MVCの方の)Viewでやるような編集を
引っ張ったオブジェクトをネタにやってて、
その編集結果をそのオブジェクトに上書き保存wとかやってる悪寒。
とはいえ、VBの時代じゃあるまいし、今時そんな設計ありえるのかね?
836 :
デフォルトの名無しさん :2005/09/29(木) 12:22:01
>>835 hibernateのソースコード読んでみれ
元ネタにも触わって無くても更新されるって書いてあんべ
更新したくなければevict()すればいいのに(マリー
テーブル単体の更新・削除・挿入に関しては便利 結合し始めるは微妙?
839 :
デフォルトの名無しさん :2005/09/29(木) 21:04:40
Seaser2 のS2Hibernate を使うと便利だよ。トランザクションも自動でやってくれるし、Sessionやコネクションの取得や解放も気にしないでロジックくめる。 パフォーマンスもそんなに悪くない。キャッシュが有効なときはJDBCより良いケースがある。全体的にコードの見やすさが向上するよ。
テーブル設計から任せてもらえるなら是非使いたく候。 Hibernate が適用できそうにない案件ばっかで泣ける。
>839 こんなところまで来て宣伝すんな 2行目seaser関係ねぇしw
>>841 そういうお前はちゃんとつかいこなせているのか?戦闘力はいくつぐらいだ?
ところで、Oacleのパッケージでhibernate.dialectに設定する RDBMSの方言を吸収するためのクラスを教えてくれ。 どうもマッピングでうまくいかねーorz
デルモヲチ(デルモオタ?) Re: hibernateを利用してはいけない5つのシチュエーション
837はどっちかつーとネタであっていちいちevict()せにゃならんやり方に問題があると言いたくてだからマリーなわけなんだが
>>848 かわいそうに。今頃必死でevict()入れてるよw
equalsの定義が間違っているせいでupdateされちゃうってどういうこと?
>>850 朝までにはk(1)さんが教えてくれるよ。
それにしてもスパム災難だな。
デルモヲチブログと比較されたせいで獄長の標的w
シチュエーション4はあからさまに胡散臭いわ。 Dirty Flagはないけど、プロパティの変更を調べてUpdateしてたはず。 プロパティいじってんのに勘違いして全Updateと思い込んでるんじゃ? Hibernateの更新操作の挙動って、仮想メモリの考え方(File Mapping)に 近くて、その辺を知ってる人にとっては扱いやすいと思うんだけどなー。 あるエンティティの関連エンティティをLazyなプロパティ経由でアクセスした タイミングで、セッション中に存在しなかったら自動的にストレージから読み込む。 セッション中のエンティティが更新された(Dirty)なら適当なタイミング(flushなど) で自動的にストレージに反映される。 セッション -> 物理メモリ エンティティ -> ページ プロパティ操作 -> メモリアクセス データベース -> マッピング先のストレージ ほら、似てると思わない?
シチュエーション4は、 書いた奴が永続化オブジェクトを分かってないということでFA?
FAくさいね。 後はスパムがそれを認めるかどうかだな。 あるいは某Aのように緘黙症になるかw
獄長って誰のことですか?
アナタのことです。
結局、getterいじったから4の現象が起こったということでFAなのかな? 普通、問題が起こった瞬間にそこを疑いそうなもんだが・・・
結局シチュエーション5は自分自身のことだったというオチですか。素晴らしい。
大人気ない
その粘着ぶりは大人気ない
大人気なくても、おもしろいから良い。 Prologつまんね。
スレ読んでないし Criteriaしてるし
人のハナシ聞いてないし…
化粧してるし
おっ、クリテリアがいる
> 865 ワラタ
>>851 いや、スパムもブログの賑わいと言うし、一躍有名ブログ化はおいしいw
てか、獄長を起こした功績が大きい。久しぶりのJavaネタに俺様ウットリ。
海老の画像を全部アマゾンのアフィリンクに置き換えてJavaネタを書け
と言いたいw
スパムは獄長を釣るエサだったクマー
>>859-865 のまとめ。
エビ「大人気ない」
エビ「その粘着ぶりは大人気ない」
koichik「おっ、クリテリアがいる」
エビ「人のハナシ聞いてないし…」
エビ「化粧してるし」
エビジョンイル キタ━━━━━━(゚∀゚)━━━━━━!!!!
エビジョンイルさんてサンプルまでエビなのが徹頭徹尾というか
首尾一貫というか、
>>829 に深く同意
最後は 「Prologしてるし」 がいいな。
ibatisでstruts見たいに、#formbean.innerbean.fireld#みたいに指定できないですか?
やっとコメントがついたかと思ったら… 大人気ないw
あの不透明感は大人気ないw
> あ、あとそのうちでいいんで教えてください。 ヒント:トラックバック
なんかかわいそうになってきた。
結果的にはオレンジニュースに晒しものにされた形だな。 あそこに取り上げられなければ( ´_ゝ`)フーンで終わったのに。
Open Session in View って、そんなに避けなきゃいけないものですか? ガンガン使いまくってるんですけど。 更新系の処理後は、たいがいリダイレクトしちゃうんで、 プレゼンテーション層ではDBからデータひろってきて表示するだけ。 どのみち別セッションだし、ガーッてセッション開きっぱなしです。 まずいの?
モヒカンデビュー未遂パターン ・大口を叩く ・オレンジニュースに取り上げられる ・2chに晒される ・獄長に見つかる ・コテンパン
>>881 まずいと思うならまずいし、思わないならまずくない。
作るものとか考え方によるんじゃない?
>>881 > Open Session in View って、そんなに避けなきゃいけないものですか?
困ってなければいんじゃね?
> 更新系の処理後は、たいがいリダイレクトしちゃうんで、
こういうのってよくあるのか?
> プレゼンテーション層ではDBからデータひろってきて表示するだけ。
> どのみち別セッションだし、ガーッてセッション開きっぱなしです。
それだと更新とその結果表示で同じDBアクセスしたりしないのか?
>>885 > ある程度F5よけになります。
履歴上は全て表示系のURLになるわけか。
submitボタン連打にも有効?
> あきらかに無駄ですが、 redirect after submit するメリットを優先しています。
それだと俺んとこでは苦しいな。
887 :
デフォルトの名無しさん :2005/10/09(日) 19:09:57
>>Redirect after post とか Redirect after submit とかいうパターンです。 簡単に言うと、どういう処理方法なんですか?教えてエロい人 Hibernate のSessionを生成するコストってそんなに大きいだろうか。 Sessionの生存期間が長くなればなるほどいろんな問題を生まないだろうか。 オレのマグナムをてめぇの汚ぇケツにブチこんでションベンぶちまけてやるぜ。 自分はSessionを生成したらできるだけ速やかに閉じるようにしてます。 一回のrequest-responseループでSessionを使い棄てるようなイメージで。。 大きな問題には遭遇してないですよ。
>>887 OpenSessionInViewとは直接関係ない話。
HTMLフォームをサブミットしたリクエストでDBを更新した後
表示用のURLにリダイレクトして、そのリクエストでDBを参照して
画面表示する。
そうするとブラウザでF5しても表示用のURLがリクエストされるから
二重更新を回避できるのがメリットみたいだな。
それぞれのリクエストでは別々のSessionを使う。
>881はたまたまそのSessionをOpenSessionInViewしてる。
Middlegen使ってOracle用のmappingを作ろうとしてるんだけど、普通にantのxml書いて実行すると 指定したテーブルが存在しないって言われちゃう。MiddlegenIDE(だっけ?)を使ってみても、対象の テーブル一覧に何も出てこない。ネットで検索すると、同現象に遭遇してる人がちらほら居るんだけど 誰かMiddlegenでOracle用のマッピング作れてる人いる?
>>889 スキーマ名指定の大文字/小文字の違いとか。
891 :
デフォルトの名無しさん :2005/10/11(火) 10:53:24
Hibernate tools の hbm2java でGenerationGapパターンでPOJOを生成するオプションは無くなったんですかね? Hibernate 2の頃にあったHibernateToolsにはあったんだけど、、消えて無くなった? 皆さんどうしてますー?
892 :
デフォルトの名無しさん :2005/10/11(火) 11:03:39
>>875 >ibatisでstruts見たいに、#formbean.innerbean.fireld#みたいに指定できないですか?
普通にできてますけど・・・
失敗すんの?
894 :
デフォルトの名無しさん :2005/10/11(火) 11:56:02
>>893 ありがとうございます。えーと、Toolsはjarの中身から取り出して使ってます。
URLにあったantタスクの使い方の中に、2.*の時に使われていたconfigurationの設定とその使い方に関する記述が無いため
3.*になってどっか逝ってしまったかな…と思った次第です。
>>892 あ!すいません。記述ミスでした。
#formbean.innerbean[0].fireld# です。
strutsやvelocityでは、[0]は配列でもリストでも可能でしたのでibatisでもと思ったのですが、
そんなメソッドはないといわれ、[0]をメソッド名としてみてしまいます。
iterateタグでも一部で切るのですが、配列の場合はだめでした。
HibernateでDBからデータを取得する場合、主キーが分かってる時は Hoge hoge = (Hoge)session.load(Hoge.class, primaryKey); みたいな感じで取得出来るのですが、主キー以外のカラム値しか分からない場合、 Hogeのオブジェクトにそのカラムの値のみをセットして、DBから一致するデータ全てを 取得する方法はあったりするのでしょうか? Hoge hoge = new Hoge(); hoge.setVal("aaa"); List list = session.何らかのメソッド(hoge); みたいな感じで。 もし、こういうのが出来ない場合は、テーブルのカラム数に応じた処理を書かないと いけないのでしょうか?
query.setProperties(obj)とかクライテリアクエリのExampleとか
898 :
896 :2005/10/17(月) 18:52:45
>>897 クライテリアクエリのExampleで出来ました!
ありがとうございます!
Hibernateで主キーのUpdateって出来ますか? 今回の案件でHibernate使うか迷っててコレが出来れば使おうと思うんだけれど。
やったことないけどevictしたあとupdateすればいけるんじゃない?
主キーのupdateが必要なシチュエーションが思い浮かばない・・・
自然キーを主キーにしちゃったところへ お客様からコード洗替のお知らせが。とか。
そりゃもうhibernateの出番じゃないな
ファイルマンせーな人たちがDB使い始めるとなぜか主キー更新とか、 キーなしテーブルとか出来上がっちゃったりすること多い
でも主キーを仮番で振るってのは結構ありがち。
一意インデックス使うなら主キー必要ないんじゃない?とはいつも思ってる
>>900 のやり方ではイケなかった
updateするHQLを書けばイケるっぽかった
ibatisで Reader reader = Resources.getResourceAsReader(”設定ファイル”); SqlMapClientBuilder.buildSqlMapClient(reader); しているのですが、 一回実行し、設定ファイルを変更して、もう一度実行させても 設定ファイルの変更が更新されません。 修正した設定ファイルを毎回読込ますためにはどうしたらよいでしょうか。
>>909 実は違う位置にある設定ファイルの内容を変更しているとか。
readerの中身をダンプして、本当に編集した物を読み込んでいるか確認してみては。
そもそも1回実行するごとに別のプロセスになるから、毎回読み込ませないほうが
難しいと思いますが(何か常駐してるとか)。
911 :
デフォルトの名無しさん :2005/10/31(月) 00:05:36
>>617 >Hibernate3 + Java5 で、マッピングにEnum使えない様なんですが、あってますか?
先週からHibernateを学習し始めたのですが、3.1では使えるみたいですね。
UserTypeというインタフェースを実装して、EnumとDBのマッピング方法を
実装する必要があります。このページにあるGenericEnumUserTypeを流用
しても良いでしょう。
http://www.hibernate.org/272.html
ibatisのタグが貧弱なんで、velocity+ibatisでibatisの設定ファイル書いたら いろんな条件でもかなり柔軟に設定できます。 これ結構お勧めかも・・・
>>912 <isNotNull>とかのDynamic SQL周りでしょうか。
複雑なSQLは書いてないのでiBatisでも気にはなりませんでしたが
具体的にはどういう感じになるのでしょうか。
>>913 俺は >912 じゃないが、分岐とループの明快さだろ。
SQL のテンプレ問題は HTML の動的デザイン問題に
類似している部分がある。
ってかもう、SQL も JSTL を標準に(ry
>>912 オレもibatis遣いなので興味津々。
どこかにsampleをうぷしてくれたら、今後あなたのいる方向に足を向けて寝ません。
Hibernate 3 と PostgreSQL8.0.3を使っています。 product_categoryというテーブルに、id,sub_id,name があって、id と sub_id が複合キーであったとします。(他のテーブルにも複合キーが至る所にあります) middlegenを使うとcomposite-id タグへ自動的にid と sub_id がマッピングされ、hbm2javaを使ってPOJOを生成すると 〜〜〜PK.javaというクラスも生成されています。 このテーブルへデータを追加して保存をしようとすると、 org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): クラス名 とエラーが出ます。idとsub_idのうち、idはDB側のシーケンスを使って自動生成しています。sub_idもストアドを使って自動生成します。 この場合、hbmファイルはどのように記述すればよいでしょう? アプリ側で〜〜PK.javaのインスタンスを生成してPostgreSQLからいちいちシーケンスなどの値を取得してインスタンスへセット…… なんてことしないとダメなんですか?
917 :
916 :2005/11/06(日) 01:45:29
マニュアル読み返していたら、 7.4 複合識別子としてのコンポーネント の部分で、 複合キーを生成するためにIdentifierGenerator を使用することができません。代わりにアプリケーションはそれ自身の識別子を割り当てなくてはなりません。 とありますた(;´д`) まぁ仕方ないか…お騒がせしました
まあ、、idのカラムは必須でないなら、 好きのようにIdentifierGeneratorを作れば大抵の場合幸せになる。
ibatisって、クエリーのキャッシュを使用するようで、 select 条件1 name 条件2 age の設定ファイルで、初回条件1で、2回目条件2だと、条件1が使用される仕様になっているようです。 キャッシュを無効にする方法知っていませんか。
>>919 君の書いているのは例えば
<isNotEmpty prepend="and" property="employeeName">
EMPLOYEENAME like '$employeeName$%'
</isNotEmpty>
<isGreaterThan prepend="and" property="deptNo" compareValue="0">
DEPTNO = #deptNo#
</isGreaterThan>
こんな感じのソースのこと?
もしそうなら、オレの所ではキャシュされてる云々は発生してないけど・・・
も少し詳細な話と、『クエリーのキャッシュを使用するようで』の根拠を
書いてみて。
Hibernate3 で、実行時にhibernate.cfg.xml を読み込むようですが、 CLASSPASSやjavaの実行時引数か何かでファイル名を指定することはできませぬか。
>>922 ありがd。自前で実装せにゃあかんのね。がんばってみる。
many-to-oneプロパティを相手がいなければnullにしたいんだが方法はないだろうか <many-to-one name="fuga" unique="false" not-null="false" update="false" insert="false" column="fuga_id" /> と指定してもプロパティの値に相手が無いと No row with the given identifier exists: [my.Fuga#1234] とか怒られるんだが。
自己レス one-to-oneでどーにかなりそうなふいんき、なんかキモいけど
>>924 Hibernate3ならnot-found="ignore"
Hibernate3なんだが Parent と Child が1対多結合してるときにHQLで from Parent p where size(p.childs) = 0 とやると子供がいない親が抽出される(childrenじゃないのは気にするな) しかし、orで条件を追加して from Parent p where size(p.childs) = 0 or p.childs.age = 13 とするとorなのになぜか13歳の子供を持つ親しか出てこなくなる これは仕様だろうかバグだろうか?
バグ(お前の頭の)
929 :
デフォルトの名無しさん :2005/11/25(金) 02:15:13
そういえば、EJB3のRIってことになってるGlassfishだけど、このスレ的にはToplinkがオープンソースになったってことでもっと祭ってあげてもいいと思うんだけど。
>>929 >Toplinkがオープンソースになった
マジで?本当ならうれしいなあ。
今Googleで検索したり、OTNを見たりしたけど、OpenSourceと書かれた
情報は見つけられなかったよ。どっかに情報ない?
932 :
929 :2005/11/25(金) 04:59:46
Sun===>TopLink Oracle=>TopLink BEA===>Kodo JBoss=>Hibernate で、 IBM===>??? IBMってどうするつもりなんだろうね。 まさかGeronimoで採用のOpenEJBに 開発陣をブチ込むとか?
>>932 それ、TopLinkのオープンソース化じゃないんじゃないの?
TopLinkってすごいの? 良く知らないんだけど.... EOFよりも良い?
>>934 そのようですね。
TopLinkの一部は寄贈されるようですが、TopLinkは全然売り物のまま。
残念。
>>935 EOFは知らないけど、TopLinkは設定のGUIが楽で良い。
ただ、Oracleが買ったせいでOracle DBしかサポートしないことに
なっちゃってるのが他のDB使いたい人には問題だけど。
BEAはウンKodoか… 死亡決定だな。
iBATISって何て読むの??
940 :
929 :2005/12/01(木) 04:04:40
イバッテマス(`・ω・´)
941 :
939 :2005/12/01(木) 08:32:06
>>940 ヽ(`Д´)ノ ウワァァァン
ほんとのこと教えてよ!!
942 :
デフォルトの名無しさん :2005/12/01(木) 08:48:24
i いろんな B バストみて A あなたの T ティンコから I いっぱい S 精子放出 どうもありがとうございました。
>>941 大体質問に対してまともな回答がない時は、質問の仕方が糞か、誰も知らないか。
今回のように、少し調べれば分かるようなことを聞くとまともな回答は付かないだろうね。
946 :
939 :2005/12/01(木) 23:43:30
947 :
デフォルトの名無しさん :2005/12/03(土) 00:15:46
おいみんなきいてくれ。 JBossスレで、POJOの話をすると 刺客を送りつけられ殺し屋に暗殺されるということ らしいが、なんでよ? Hibernate使ってると暗殺されて行方不明扱いになっちまうのか?
>>947 鮫島事件でぐぐれ。所詮その程度の話だ。
949 :
デフォルトの名無しさん :2005/12/04(日) 23:04:15
iBATISってhibernateみたいなOne to Many ってできないんでしょうか?
>>949 できる。
まずはTutorial、Developer'sGuideの順に目を通せ。
iBatisでBooleanとかDate型にNULLが入る場合はどうしてますか? ドキュメント見るとnullの場合は自分が決めた値入れるの? > <parameter property ="propertyName" [jdbcType="VARCHAR"] [javaType="String"] > [nullValue="NUMERIC"] [null="-9999"]/> <resultMaps> <resultMap id="FooEntityResult" class="FooEntity"> <result property="FooCode" column="FooCode" /> <result property="FooName" column="FooName" /> <result property="HogeHogeFlg" column="HogeHogeFlg" /> <result property="CreateDate" column="CreateDate" /> <result property="UpdateDate" column="UpdateDate" /> </resultMap> </resultMaps> 実は.netで開発してるんだけど資料が少なくて泣きそう。 javaの場合はどうやってるか参考にちょっと教えてもらえないかな?
952 :
デフォルトの名無しさん :2005/12/05(月) 22:50:13
>>951 DBのnull値はObjectの参照値nullになった気がするけど記憶に自信ないや。
ちょっと試してみてよ。(今ソースが手元にないのでゴメン)
余談だが、一ひねり必要なのは、いわゆる名称テーブルの行セットが
削除されてた時の関連Objectの対応かな。おれはSQLを
select
#employeeId# AS employeeId,
NVL(EMP.ENAME,'') AS employeeName
FROM DUAL
LEFT OUTER JOIN EMP ON EMP.EMPNO = #employeeId#
とやってしのいでいるけど、他のiBATIS遣いの方々はどうしてるの?
( OracleDialect丸出し失礼 )
>>951 参照型であればnullになったはず。
問題はプリミティブ型の場合で、何も対処しないと例外になったはず。
なので、<result>にnullValue="false"(booleanの場合)を書きました。
955 :
デフォルトの名無しさん :2005/12/12(月) 23:33:41
Hibernate使い始めたんですが、 テーブルのカラムにdate[](配列)が定義されてんですけど マッピング定義ファイルの書き方がわからんのです。 どなたかわかります?それとも無理なんでしょうか? <property name="regularDate" type="java.util.Date[]"> <column name="regular_date"/> </property>
JDBCで扱えるならUserTypeでどーにかならんか?
Hibernate 3.1 リリース記念。
Mapping-Framework使いの皆さんに聞きたいんですが、 今回、Java⇔Oracleで、基幹システム(見積、受注、発注、出荷、在庫など)を 組むことになったのですが、 こういうのって意外と顧客独自な複雑な仕様があるので、テーブルもすごい何十個とかあります。 全てのテーブルのMappinngクラスを作ったりするもんなんですか? 複数テーブルとリレーション組んだりする時もその都度Mappinngクラス作るんですか? なんか、結局SQL文コードに埋め込む形になっちゃいそうなんですが・・・ 実際どうなんでしょうか?
>>958 マッピングクラスなんか自動で作ってくれるツールがあるわけだから、ケチらず全部作れば?
あと、SQLをコードに埋め込むかどうかは、マッピングクラスを全部作るかどうかとは関係ない話。 ORマッピング使ったからといって、全部SQL使わずにやるわけじゃないし。
Oracle Toplinkはどうした。
963 :
958 :2005/12/15(木) 09:27:28
レスありがとうございます。
>>959-960 本当にマッピングが、仕様の変更に迅速に対応できるのか、
マッピングとSQLの混在で、中途半端にならないか
という事が不安です。
逆に、こういう時はマッピングで、この時は、SQLとかいう
推奨の取り決めなどあるのでしょうか?
>>961-962 DB2やpostgreSqlも視野に入れてるので今回は使わない予定です。
965 :
964 :2005/12/15(木) 09:56:21
追伸:知ってるかもしれんがTopLinkの一部はEJB3のRIの土台になる、 つまりOracleDB以外でもOKなオプソになる。 GlassFishでぐぐってみて。
>>963 > 逆に、こういう時はマッピングで、この時は、SQLとかいう
> 推奨の取り決めなどあるのでしょうか?
1件単位の処理はマッピング
複数レコード一括処理はSQL
抽出はxQL
967 :
958 :2005/12/15(木) 14:10:25
>>964 iBATISいいですね、SQL部分とロジックを分けれるので、管理も楽そうです。
>>965 TopLinkとGlassFishは、調査中です。難しそうですね・・・
>>966 >複数レコードの一括処理
ってのは、いわゆるバッチ系でしょうか?
バッチ系じゃなくても、普通にあると思うけど。
>>968 たとえば、ある10件のデータを持ったテーブルの内容を画面に表示したいってのは
複数レコードの一括処理に入りますか?
971 :
958 :2005/12/15(木) 16:15:37
>>970 一応、Hibernate使ってるんですが、
>>969 の場合
selectは、書く必要がないと思うんですが・・・
972 :
デフォルトの名無しさん :2005/12/15(木) 16:16:04
>>967 iBATISはSpringと組み合わせると、なお楽チンにソース書ける。
Spring提供の 『 iBATIS用お助けAbstractClass 』 を継承する形。
さすればカッタルイお決まりソース部分は親クラスがやってくれる。
iBATISのライバルに位置するものとしては、
S2DAO、SpringJDBCが存在する。
そろそろ次スレ準備ヨロ
974 :
デフォルトの名無しさん :2005/12/15(木) 21:32:28
このスレのみんなは皆DbUnit使ってテストしてるの? DbUnitはO-Rマッピングと世界が違って どうも何か違和感を感じるんだけど
>>971 構文上selectを省略できるという意味?
976 :
デフォルトの名無しさん :2005/12/15(木) 23:42:46
SQLは集計を含んだ副問い合わせのときしかかかなかったな。 あとはHQLだった。
クライテリアは、条件の設定が面倒だったので、使わなかった。 結合の制御もできないしね。 「select」はほとんど省略したけど、HQLを使った。 今ならprojectionが導入されたからクライテリアを使うかもしれない。
J2EE5の説明みててアノテーションでORDER BY句が指定できるように WHERE句も指定できるようにならないかな
J2EE5などない。
こういうのをモヒカン族っていうのかな
982 :
デフォルトの名無しさん :2005/12/16(金) 10:12:42
データベースのテーブルや、フィールド名とかの命名規約ってあるのかな? たとえば、得意先マスターだったら、今までは、 テーブル名:CUSTOMER フィールド名:CUSTOMER_NAME なんですけど、 マッピングを自動生成させると、 getCustomer_Nameっていうプロパティ名が生成されて気持ち悪いんですけど・・・ やっぱり、getCustomerNameであってほしいのですが、皆さんはどうしてますか? データベースの推奨では、CUSTOMER_CODEとかアンダーバーで区切りなさいって良く聞くのですが・・・
983 :
982 :2005/12/16(金) 10:22:35
すみません誤爆でした。 customer_nameは、 getCustomerNameにしてくれました・・・ アンダーバーを使おうと思います
985 :
デフォルトの名無しさん :2005/12/16(金) 17:56:01
Hibernate ORマッピングって流行ってるの?
ibatisのマッピングものたりない・・・。 listを出そうとするとエラーになる。 そのままtoString()で出してほしいのですが。
988 :
デフォルトの名無しさん :2005/12/16(金) 21:03:58
モノにもよるとおもうが、オレ様の周りじゃ流行をこえて常識になってるけど
ibatisしか使ったことねえのだが hibernateって複合プライマリキーのテーブルの扱いがへんでねえか?
990 :
デフォルトの名無しさん :2005/12/17(土) 13:45:38
>>981 村社会と比べたら全然モヒカン族の方が好意的だよ。
モヒカン族はテクノクラシー(技術至上主義)
村社会は社会主義社会、北朝鮮的。昔のnifty時代によく見られた
その名残としてブログや2chが出るまでは
閉鎖的な掲示板で村社会的なものがよく見られた。まさに洗脳に近い。
モヒカン族は人を洗脳しない。つっこみは入れるが意見を受け容れる
まさにアメリカ的民主主義。
>>989 複合プライマリーキーをフィールドに持つIDクラスで管理する。
IDクラスはequals()とhashcode()をオーバーライドする必要があるが、Hibernate Toolsを使えば自動でやってくれる。
こんなかんじなんだけど、どう変なの?
hibernateのレイジーなんたら。 Webアプリにはむかねえと思った
995 :
デフォルトの名無しさん :2005/12/23(金) 12:13:44
>>992 つOpen Session In View
997 :
デフォルトの名無しさん :2005/12/23(金) 19:26:35
野茂暗くないよ
ばーかばーか
ばーか
ばーかばーか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。