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

このエントリーをはてなブックマークに追加
Prevoius Thread
「Java⇔RDBのMapping-Frameworkを語るスレ Vol.2」
http://pc5.2ch.net/test/read.cgi/tech/1086315004/
「Java⇔RDBのMapping-Frameworkを語るスレ
ttp://pc5.2ch.net/test/read.cgi/tech/1049030272/

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

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

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

詳細は、>>2以降に。
●O/R-Mapping Framework各種
 [HYBERNATE]
  ttp://www.hibernate.org/

 [Cayenne]
  ttp://objectstyle.org/cayenne/

 [Torque]
  ttp://db.apache.org/torque/

 [CasterJDO]
  ttp://www.castor.org/jdo.html

 [ObJectRelationalBridge (OJB)]
  ttp://www.terra-intl.com/jakarta/ojb/
 
 [iBATIS - SQL Maps]
  ttp://www.ibatis.com/common/sqlmaps2.html
 
 [Java Ultra-Lite Persistence (JULP)]
  ttp://julp.sourceforge.net/index.html
 
 [Jakarta Commons DbUtils](O/R-Mappingというよりは、O/R-Bridge)
  ttp://jakarta.apache.org/commons/dbutils/
●コネクション・プーリング・フレームワーク
 [Jakarta Commons DBCP]
  ttp://jakarta.apache.org/commons/dbcp/

 [c3p0 : JDBC DataSources/Resource Pools]
  ttp://sourceforge.net/projects/c3p0

 [XAPool : Pool object for JDBC connections and XA connections]
  ttp://xapool.experlog.com/



●JDBCに関する情報源
 [JDBCの基礎]
  ttp://www5b.biglobe.ne.jp/~hrk117/personal/pc/jdbc/

 [JDBC API解説]
  ttp://akimoto-jp.com/java/Database/Jdbc-api/index.html
●参考サイトや情報源
--- 比較資料など ----
 [JDBC, Hibernate, Torque, DbUtilのベンチマーク比較]
  ttp://d.hatena.ne.jp/masanobuimai/20031216#p2

---- Hibernate関連情報 ----
 [HIBERNATE - Relational Persistence for Idiomatic Java 【日本語訳版]
  ttp://www.ozacc.com/library/java/hibernate/doc/html/index.html
 
 [Hibernate User FAQ 日本語訳版]
  ttp://nekop.programmers.jp/wiki/Hibernate/?HibernateUsersFAQ
 
 [@IT - Hibernateで理解するO/Rマッピング1,2]
  ttp://www.atmarkit.co.jp/fjava/rensai3/ormap01/ormap01.html
  ttp://www.atmarkit.co.jp/fjava/rensai3/ormap02/ormap02.html

 [JAVA開発メモ - Hibernate]
  ttp://www.moriwaki.net/wiki/index.php?%5B%5BHibernate%5D%5D
 
 [はてなダイアリー - R2D2氏の日記]
  ttp://d.hatena.ne.jp/R2D2/searchdiary?word=%2a%5bHibernate%5d
 
 [はてなダイアリー - koichik氏のひとりごと - Hibernate入門記]
  ttp://d.hatena.ne.jp/koichik/searchdiary?word=%2a%5bHibernate%5d
 
 [Hibernateメモ]
  ttp://muimi.com/j/hibernate/
 
 [Hibernateを試してみる]
  ttp://docs.positrail.org/pukiwiki.php?Document%2FHibernate

5デフォルトの名無しさん:04/07/24 16:16
続き:

 [Hibernateのマッピング情報を生成するのに便利なツール]
  - XDoclet
    Java Beanからマッピングファイルを生成
    ttp://xdoclet.sourceforge.net/xdoclet/index.html

  - Hibernate Synchronizer
    Eclipse用プラグイン。DBのテーブル構造からマッピングファイルを生成
    ttp://www.binamics.com/hibernatesync/
  
  - JFaceDbc
    Eclipse用プラグイン。DBのテーブル構造からマッピングファイルを生成。
    ttp://www.pratocity.com/index.jsp?mod=/jface/jfacedbc.jsp
    (新バージョンから有償になった?)
  
  - Exadel ORM Studio Hibernate Edition
    Hibernateにも使える、統合ORM操作環境(有償)
    ttp://www.exadel.com/products_ORMstudio.htm
  
  - Hibernateと親和性のある、国産IoCコンテナ"Seasar"
    ttp://www.seasar.org/
    ttp://seasarproject.g.hatena.ne.jp/
    ttp://itpro.nikkeibp.co.jp/free/JAV/J2EE/20040412/1/
    


---- Cayenne関連情報 ----
 [Cayenneの紹介と、基本的な使い方(英語)]
  ttp://www.theserverside.com/articles/article.tss?l=Cayenne
続き:

---- Torque関連情報 ----
 [Torqueを動かしてみる]
  ttp://homepage1.nifty.com/kingyoshi/computer/jakarta/torque.htm
 
 [Torqueチュートリアル]
  ttp://www.jajakarta.org/turbine/jp/turbine/torque/tutorial.html

---- JDO関連情報 ----
 [Castorを使用したオブジェクト・リレーショナル・データ・バインディングの基本を学ぶ]
  ttp://www-6.ibm.com/jp/developerworks/java/021025/j_j-castor.html
 
 [CastorでオブジェクトをRDBにマッピング]
  ttp://www.atmarkit.co.jp/fxml/rensai2/xmltool06/01.html

---- DbUtils関連情報 ----
 [DbUtilsメモ]
  ttp://www02.so-net.ne.jp/~kikuta/dbu/index.html

---- コネクションプーリング関連情報 ----
 [Jakarta Commons DBCPを使ってみよう]
  ttp://taka-2.com/jclass/DBCP/

 [DBCP利用法 from "『カモン!Commons!』 Jakarta Commonsを使ってスキルアップ" (2002/09)]
  ttp://www.mobster.jp/wiki/index.jsp?pid=Commons#i10
カイエン
名前が激しく気に入った
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は使ったことある
>>8
まず、おまいの感想を聞かせれ。
>>7
ダグラス・カイエンを連想するかポルシェを連想するかで駄目さ加減がわかるなOTL
12デフォルトの名無しさん:04/07/24 20:13
>>10
実はDbEditしか使ったことがない。
がDbEditはグーなり
>>11
ガキはFF6と言う
14デフォルトの名無しさん:04/07/24 21:53
Cay・enne
━━ n. カイエンヌ ((フランス領Guianaの港市で主都)).

cay・enne
━━ n. トウガラシ (cayenne pepper).
さらに親父は海援隊を(ry
>>13
まぁFF6の主人公達はかなりFSSから名前を持ってきてるわけだが。
ティナのファミリーネームとかな。
>>16
それを踏まえてのレスなんだが
Cayenne/JDBC/SQLite ってやってる人います?
Java WorldにCayenne特集が載ってたよ。最新号だ。
追加情報。
●O/R-Mapping Framework各種
 *NEW* [PriDE]
  ttp://pride.sourceforge.net/
 
 *NEW* [Tornado Object-Relational Mapping Engine]
  ttp://tornado-db.sourceforge.net/
 
 *NEW* [CocoBase Enterprise O/R (商用製品)]
  ttp://www.thoughtinc.com/cber_index.html
  
 *NEW* [JDX (商用製品)]
  ttp://www.softwaretree.com/index1.htm


●参考サイトや情報源
 *NEW* [Wake a hibernate up,in hurry !(スレ住人による日本語資料)]
  2スレ目47氏提供
  ttp://hirohiro.homeip.net/essay/2004/06/20040623.htm

  *NEW* - Hibernate+XDocletの解説とサンプルコード
    ttp://www.commentout.com/people/takai/memos/hibernate_xdoclet/

  *NEW* - Hibernate + Middlegen + Antを使用したbuild.xmlの例
    ttp://www.boundless-ocean.ne.jp/archives/000102.php

  *NEW* - MiddlegenのAntタスクの仕様(英語)
    ttp://boss.bekk.no/boss/middlegen/ant/index.html

  *NEW* - EJB 3.0 Early Draft Review Released
    EJB3.0では、Hibernateの思想が取り入れられます
    ttp://www.theserverside.com/news/thread.tss?thread_id=27005
●Cayenne関連情報

 *NEW* [CayenneでORマッピング(スレ住人による日本語資料)]
  ttp://www.fk.urban.ne.jp/home/kishida/kouza/cayenne.html
  2スレ目598氏提供。
  
 *NEW* [Aggregate Functions / MIN,MAX,COUNTなどの集約関数の使い方]
  ttp://objectstyle.org/cayenne/examples/aggregate-functions/index.html


*NEW* ---- JDBC⇔RDB間モニタリングツール ---
  O/Rマッパー使ってると、JDBCドライバとRDB間で、どのようなやりとりが
  されてるのか知りたいときがある。そのためのツール。
  [jdbcdebugger]
   ttp://jdbcdebugger.sourceforge.jp/

  [P6Spy]
   ttp://www.p6spy.com/



*NEW* ---- その他、有益な情報源 ----
  [ダイコン時代のORM - 結果セット中心]
   ttp://d.hatena.ne.jp/higayasuo/20040708#1089245059
  [ダイコン時代の設計手法 - モデリング]
   ttp://d.hatena.ne.jp/higayasuo/20040609#1086738237
  [EJB3.0の概要が明らかに──「アンチEJB」派の意見を取り込み大幅変更]
   ttp://itpro.nikkeibp.co.jp/free/JAV/NEWS/20040510/1/
*NEW* --- 網走番外地:Java向け以外のO/R Mapping ----
  ●Microsoft .NET用
   [NHibernate]
    ttp://nhibernate.sourceforge.net/
   [ORM.NET(商用)]
    ttp://www.olero.com/OrmWeb/index.aspx?p=ORM.ascx
   
  
  ●Perl用
   [Object-Interface-1.0]
    ttp://search.cpan.org/~gwelch/Object-Interface-1.0/
   [SQL-Generator-0.02]
    ttp://search.cpan.org/~muenalan/SQL-Generator-0.02/
  
  ●Ruby用
   [rorm - Ruby Object-Rdbms Mapper]
    ttp://www.commentout.com/people/takai/src/rorm/
   [TapKit]
    ttp://www.spice-of-life.net/tapkit/index_ja.html
   [SDS]
    ttp://www.starware.one.pl/software/sds/index.html
>>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
>>7 >>11 >>16
FSSを調べてみたら、FF6と同じような餓鬼の扱いじゃねえかw

約20年も前のものにやたらと詳しいな藻前ら


やはりこれだな。
http://content4.eu.porsche.com/prod/cayenne/cayenne.nsf/jpnjapanese/cayenne
>>11でポルシェって書いてるじゃん
やっぱりこれだな。
http://www.hapima.com/prd/02000189/02000189owh0701/
28デフォルトの名無しさん:04/07/31 14:25

プロダクトレビュー
話題のO/Rマッピングツール「Cayenne」を使う
http://www.atmarkit.co.jp/fjava/products/cayenne/cayenne_1.html
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
うおー、それはだめだ。
断固反対。
>>39
断固阻止!お前はこのスレの北朝鮮に認定!
おれはブッシュやるね。
爆撃するぞ〜爆撃するぞ〜徹底的に爆撃するぞ〜
おまいらMap厨よりゴミクズだな
でもMap厨より微笑ましい気もする(w
っつうか、制服がなくなるくらいなら、HibernateもCayenneも使わずMapでやるよ。
4544:04/08/04 02:41
おまえら、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 2.1.5リリース
http://sourceforge.net/project/shownotes.php?release_id=257981
minor bugfixes and improvementsだそうな
Hibernateなんかバージョンアップしてもしかたないんだよ。
オブジェクトモデルとリレーショナルモデルのギャップ埋めるより、事務服のおねえさんがオレの心のスキマ埋めてくれた方が仕事がはかどるんだよ。
>>47は空気嫁ないお河馬さん
前スレの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書けて結果はビーンになってるとか。。。)
>>56 
hibernateでネイティブなSQLの記述

調べるとこんなの出ました。
http://www.hibernate.org/hib_docs/reference/en/html/querysql.html

-sesson.createSQLQuerry(...) - 本体は引数にベタ書き
-session.getNamedQuerry(...) - 本体はhbm(?)にsql-query要素に記述

そうでありましたか。。。

とりあえずMiddlegenとhbm2javaを使って既存テーブルからマッピングするHibernateのチュートリアル書いときました。
http://www.fk.urban.ne.jp/home/kishida/kouza/hibernate.html

でも、>>39の陰謀による次の問題に荷担してしまうなら、削除します。
http://www.google.com/search?q=%E3%83%8A%E3%83%BC%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%83%E3%83%97+%E5%BB%83%E6%AD%A2
>>57
そこまでしてhibernate使う意味あるのか?
>>60
GJ!!
>>62
どもです。
MiddlegenでXDocletタグを生成しつつ、XDocletタグからhbmファイル生成するところも書き足しました。
64メソドロジスト:04/08/09 16:50
RDBなんてもう古いよ
所詮テーブルのストアだから
いずれオブジェクトグラフの保存に適したODBに取って代わるだろう
と言われつづけて早十数年
>>64

ODB ってよくワカランのだが、インスタンス化の範囲ってどうやって決めるの?
給与明細に社員名だそうとして、社員オブジェクト持ってきたら、
家族構成とか住所とか配属履歴とか余計なインスタンスがくっついてきたり
しないんですか?
はいはいこっちに行きましょうね

OODB - オブジェクト指向データベース
http://pc5.2ch.net/test/read.cgi/db/1057157392/l50
>>66
lazy evaluation
>>67
こりゃ失礼

>>68
面倒くさそう
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
本当?それとも性能や運用の面でそうすることが多いということ?
>>81
どっちに対して本当って聞いてるんだ?
>>82
両方とも
>>83
ま、少なくとも、仕組みとしてはあるデータだけに属性を追加というのはできない。
どうにかして実現するとしても、属性がデータによって変わることがあるものは、RDBではかなり表現しづらい。
なんとかデータを格納しても、検索やりづらいし。
その属性の値が存在しないということを表現するために
nullってモンがあるわけだけどね。
Hibernateで、TorqueみたくRDBのスキーマドキュメント生成するツール
ってあるんですか?
Hibernateで用意されている必要性がわからん。
>>85
nullがあるとしても、1万件のデータのうち、ひとつのデータにだけある属性のために9999件のデータにnullを入れるのはムダだし。
ほかのデータには別の属性が複数あったり、ある属性は複数のデータがもっていたりすると、ひとつの表で表現するのは非常にムダ。
alter tableしてinsertする、というオペレーションも避けたいし。
また、そのうちのある属性は配列になっていたり、複合属性になってたりすると、データの表現だけで大変な労力が必要になってくる。
データの整合性を保つというデータベースの役割は果たせなくなるし。
>>85
そのデータにはそもそもその属性がないのか、属性はあるけども値が割り当てられてないのか、判断できないね。
>>88
そこまで統一性が無い場合って、例えばどんなデータでしょうか。(イメージつかめてない)
(まぁ少なくともJava⇔RDBからは外れそうだけど。)
>>90
代表的なのはアンケート情報
あ、あとRDBばっかり触ってると、RDBで表現できない分野のデータについて想像できなくなる
>>91
アンケート情報は定型化しなきゃ駄目じゃん、と思ったけど、何種類も違うや
つを一緒に管理する場合と理解してOK?
>>93
1回のアンケートは定型化できても、次回は少しだけ項目がかわるということはよくある。
実際に聞きたい項目は定型化していても、あとの質問での答えを引き出すための質問は質問対象によって変わるということもありうるし。
バカ?

顧客ID アンケートID アンケート質問 アンケート回答

みたいなテーブルつくっておけばいいだけじゃん。
項目増えてもオッケーでしょ。
9695:04/08/13 18:30
まあ上の例だとまずいかな。
ID・質問マスタは別に用意すべきだろう。

でも、RDBで十分対応できる範囲だな。
と、アンケートを甘く見てると、そう思うわけだね。
>>96
複数回答ありの項目があると、結構簡単に破綻するけどね。
>>95
まぁ、お前が一番バカだってこった。
>>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も入れてもいい?
>>109
>2 >4 >6
>>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だあ
>>119
君には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なら変更が
簡単、なんてことはない。
>>132
属性の型が違ったら?
>>137
すべてtext型で解決。
>>138
まぜっかえすなバカヤロウw
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の話を続けたいのかと思ったがどうも違うようだな。
他の香具師が乗ってくるよう手前で話を振らなきゃ、望み通りの
議論にならんのはアタリマエだろう。ワガママ言うなよ。
>>150
XML-DBの話はこちらへ。

データベース板 XML統合スレッド
http://pc5.2ch.net/test/read.cgi/db/1057207891/l50

情報システム板 XML-DBの今後!?
http://science3.2ch.net/test/read.cgi/infosys/1051815370/l50
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
複数のセッション使えばいいんじゃない?
JDO実装一覧

* Exadel JDO (Riflexo) http://www.exadel.com
* FastObject (Versant) http://www.fastobjects.com
* FrontierSuite (ObjectFrontier) http://www.objectfrontier.com
* IntelliBO (Signsoft) http://www.intellibo.com
* JDO Toolkit (MVCSoft) http://www.mvcsoft.com
* JDOGenie (Versant) http://www.jdogenie.com
* JPOX http://www.jpox.org
* JRelay (Object Industries) http://www.objectindustries.com
* Kodo JDO (SolarMetric) http://www.solarmetric.com
* Lido (LIBeLIS) http://www.libelis.com
* ObjectDB (ObjectDB Software) http://www.objectdb.com
* ObjectStore (Progress Software) http://www.objectstore.net
* OJB (Apache) http://db.apache.org/ojb/
* Orient (Orient Technology) http://www.orientechnologies.com/
* PowerMap JDO (SCE) http://www.powermapjdo.com
* Speedo (ObjectWeb) http://speedo.objectweb.org
* TJDO http://tjdo.sourceforge.net
* XORM http://xorm.sourceforge.net
>>158
JDO も廃れたね〜。
結局なんだったのかなぁ
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"
という文字列を直に使うとはどういうことか?
>>166
java.sql.Date対策だろ
>>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
漏れモナー
iBATISは「イーバティス」と読む
http://d.hatena.ne.jp/kagamih/20040822#p4

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

DataSource使いたいけど、うまくいかね。
この辺のドキュメントってどこかに纏まってないかな。
WEB+DBの最新号読んだが。
SeaserDAOってどうなん?
>>178
> WEB+DBの最新号読んだが。
> SeaserDAOってどうなん?

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

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

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

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

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

>>183
認定厨乙
185178:04/09/05 22:36
>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
>>188
dクス。調べてみます
192デフォルトの名無しさん:04/09/17 14:11:22
>>186
つうかdao.find("from User u Where u.Username='hoge')でええんじゃないの?
193デフォルトの名無しさん:04/09/17 16:30:26
age
194デフォルトの名無しさん:04/09/18 21:14:13
hibernateを導入するときってtop-downとかbottom-upとかいろいろありますけど、
業務で使おうって人はどれが多いですか?
195186:04/09/18 22:28:50
>>192
>>186の例でそれやると
UserテーブルをSelectして一行取得するごとにStatusテーブルをSelectしない?
196デフォルトの名無しさん:04/09/19 02:41:09
>>195
many-to-oneでしょ?
適当にJOINするでしょ。
197デフォルトの名無しさん:04/09/19 02:41:54
>>194
結局最初にDBありき。
オレテキには、そうするべきだとも思う。
198デフォルトの名無しさん:04/09/19 03:22:01
誰に訊いても「そりゃDBありきだろ」と言われた俺
199デフォルトの名無しさん:04/09/19 19:54:48
>>196
many-to-oneだよ。
show_sqlをtrueにしてログ見てるとUserを1レコード読み込む度に
StatusにSelect投げて対応する1レコード持ってきてるんだけど。
自動でjoinはしてくれないみたい。設定が悪いのかな?

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

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

200デフォルトの名無しさん:04/09/20 06:49:07
また写真が増えておるな。そのサイト。
気にせずjoinしてくれてるんだけど、なんか設定が違うんかな。
201デフォルトの名無しさん:04/09/24 11:55:08
>>177ではないんですが、私も気になる。
みんなどうしてんの?
202デフォルトの名無しさん:04/09/24 20:34:29
>>201
つまり、DataSourceがうまく設定できない自分の無力さを悩んでいるだけだと思われるが。
俺はとくに問題なくDataSource使ってる。
203177:04/09/26 16:36:04
>>201
では202さんに聞いてみましょう。

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

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

今日はJavaWorldのアンチパターンの記事を読んで、目から鱗でした。
まだまだ未熟者です。ガンガリまーす。
204デフォルトの名無しさん:04/09/26 23:19:56
S2Dao
205デフォルトの名無しさん:04/09/27 00:15:14
>>203
<property name="connection.datasource">java:comp/env/jdbc/test</property>
とやってるだけで、特別なことはやってないけど。
206デフォルトの名無しさん:04/10/02 02:06:52
Hibernateの設定用GUI(Eclupseプラグイン?)で、なにかお薦めありますか?
207デフォルトの名無しさん:04/10/02 14:41:07
設定なんか手書き。いっかい書けばいいだけだし。
208デフォルトの名無しさん:04/10/03 00:56:37
>>207
質問に答えてない。

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


>>208
質問に答えてない。
209デフォルトの名無しさん:04/10/03 01:13:50
>>208

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

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

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

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

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

まったく関係ないけど,あなたDB2のSAMPLEデータベースつかってますね?(笑)
214206:04/10/04 01:19:45
>> 212

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

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

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

>> 213

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

maven使えば多少はmiddlegenの煩雑さから開放されるかも。
217デフォルトの名無しさん:04/10/04 22:18:21
ちなみにHibernateのcriteriaは
クリテリアじゃなくてクライテリアだから。言っとく。
218206:04/10/04 23:17:05
>> 214
もう一つだけ教えてください。

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

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

実際には、
->Middlegenでhbm作成
->hbm2javaで*.javaを作成
->XDocletでhbmを作成
となるようにしておく。
そうしないと、テーブル追加したときがめんどくさい。
テーブル追加したときはhbm2javaで該当テーブルだけ*.javaを精製するようにする。
hbmは全部上書きされちゃうので、XDocletでもとにもどすというわけ。
220デフォルトの名無しさん:04/10/04 23:43:37
△hbm2javaで
○hbm2javaの部分で
221206:04/10/05 02:26:00
>> 219
即レスありがとうございます。参考になります。
やっぱり@タグは自動生成できるんですね。
222デフォルトの名無しさん:04/10/08 18:12:12
削除フラグのあるテーブルを扱うマッピングのパターンみたいなの、どっかありますか?
223デフォルトの名無しさん:04/10/09 09:25:38
Hibernateのキャッシュサイズってどこかで決められる?
無限に取り続けそうで怖くて使えね。
224デフォルトの名無しさん:04/10/09 21:41:54
Hibernateって検索の仕方がいろいろありますが(HQLとかCriteriaとか)、
みなさんはどのように検索していますか?
225デフォルトの名無しさん:04/10/09 21:55:18
CriteriaでできるところはCriteriaでやってる。
柔軟な条件の拡張がやりやすいから。
条件にあうものから10件取得しつつ、検索全件数を取得、とかがやりやすい。
Criteriaでの件数取得はパッチ当てる必要があるけど。
226デフォルトの名無しさん:04/10/10 01:24:22
>> 225
パッチって、Hibernateにパッチを当てる必要があるという事ですか?
227デフォルトの名無しさん:04/10/10 01:33:04
パッチ当ててもいいし、パッチが当てられたバイナリ使ってもいい。
228デフォルトの名無しさん:04/10/10 12:14:42
EclipseプラグインでHibernatorプラグインというのがあるのだが
どうだろうか? 
229デフォルトの名無しさん:04/10/10 13:48:10
XDocletで十分だなぁ。
230デフォルトの名無しさん:04/10/12 02:48:38
だれも使ってないのかもしれないけど、個人的にはiBatisが一番楽だな。
とにかく簡単、明解なんで。
231デフォルトの名無しさん:04/10/12 04:45:52
うん。おれもiBATIS好きだな。それこそまさに、SQLをそのままPOJOに
マッピングしてる感じで。
232デフォルトの名無しさん:04/10/12 21:19:01
俺も愛用している。
BLOBとかつかえんのが困るけど、他のマッピングツールとかって対応してるのかな?
233デフォルトの名無しさん:04/10/12 22:24:55
そんなキミらにHibernate3のカスタムSQLが素敵そうですぞ
ttp://www.theserverside.com/blogs/showblog.tss?id=Hibernate3_JDBC

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

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

あと、ちょっとスレ違いだけどS2DAOもSQL直で書けてよさそうです。
ttp://homepage3.nifty.com/seasar/s2dao.html
235デフォルトの名無しさん:04/10/13 02:39:57
>>234
あんま旨味ねーなぁ
236デフォルトの名無しさん:04/10/13 02:45:43
>>235
SQL直書きの薄いラップが必要な箇所というのが部分的に必ずあって、そのためにHibernateを使うことをあきらめることになってたりするからねぇ。
237デフォルトの名無しさん:04/10/13 02:57:38
結局、前スレかその前あたりで話題になってた
Hibernate使用時の表結合のあたりはどうなったんだ?
238デフォルトの名無しさん:04/10/13 03:03:59
え、全然問題ないけど。
神とされてたサイトに結合の記述がまったくなかっただけ。
239デフォルトの名無しさん:04/10/13 03:08:41
Map厨の人、なつかしいなぁ。
またこないかな。
240デフォルトの名無しさん:04/10/13 11:28:31
hibernate.cfg.xmlでmapping resourceを指定しますが、
数が増えると大変です。
まとめてhbmファイルを指定する方法はあるんでしょうか?
241デフォルトの名無しさん:04/10/13 19:07:47
>>238
おせーて
242186=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つだからまだ我慢できるけど関連テーブルさらに増えたらやってられんす。
243デフォルトの名無しさん:04/10/13 22:33:52
>>237
そんなあなたにiBatis

どんな結合であろうと、複雑なSQLであろうと完璧対応です。
insert, update, delete もトランザクションで完璧です。
244デフォルトの名無しさん:04/10/13 23:19:09
>>241
検索すればいくらでも出ると思うけど。
hbm.xmlにmany-to-oneとか核だけ。
245デフォルトの名無しさん:04/10/13 23:20:31
>>242
その例だったら別に from User user where user.Username=? で
全部の関連がつながった User が帰ってくると思うけど。
246デフォルトの名無しさん:04/10/13 23:46:51
>>237
確か前スレ47ノサイトでは
Object obj1 = obj[0];
Object obj2 = obj[1];
Object obj3 = obj[2];
みたいなことしてたんだっけ?(うろ覚えだけど)
247デフォルトの名無しさん:04/10/14 00:09:06
マッピング定義で結合してない場合の話だね。
248デフォルトの名無しさん:04/10/14 01:25:49
>>242
S2Dao使え!
249デフォルトの名無しさん:04/10/14 01:40:49
Criteriaでやるなら
session.createCriteria(User.class).add(Expression.eq("Username", aaa));
とかでついてくるし。
250242: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を外部ファイルに記述して読み込みたいと思ってます。
251デフォルトの名無しさん:04/10/14 13:23:38
lazy loadingがわかってないとか?
252デフォルトの名無しさん:04/10/14 13:51:46
lazy loadingについて詳しい解説キボン
253デフォルトの名無しさん:04/10/14 14:05:30
>>251
lazy-loadingはone-to-manyでは?
254デフォルトの名無しさん:04/10/14 14:08:10
>>250
関係ないけど、HQLを外部化するのってどうなの?
なんかメンテ性あがる?
コンパイルするのがめんどくさいというだけ?
255デフォルトの名無しさん:04/10/14 14:12:34
>>250
outer-join="auto"
とか。
256デフォルトの名無しさん:04/10/15 01:00:19
ハイバネって集合関数できないんだ。。。
countしたいときはListでとってsize()呼ぶしかないのかな。
257デフォルトの名無しさん:04/10/15 01:08:50
結局、関数ガリガリ使いたい場合はこういうのは使えないことが多い
258デフォルトの名無しさん:04/10/15 01:59:23
>>256
そんなことはないと思うが
259デフォルトの名無しさん:04/10/15 03:48:32
>>256, 257
自分の無知さをさらけだしてますな。
260デフォルトの名無しさん:04/10/15 08:44:59
>>259
257はそうでもないと思うが
261デフォルトの名無しさん:04/10/15 11:59:03
変に略すやつは、まともな知識をもってないってことだね。
262225:04/10/16 07:53:12
>>224
This is an experimental API
ttp://www.hibernate.org/hib_docs/api/net/sf/hibernate/Criteria.html

experimental ・・・・実験的な orz
263デフォルトの名無しさん:04/10/16 21:12:25
2chでの話題は2chで完結させればいいのになぁ
詳細は自分のblogで書くとしても。
ttp://d.hatena.ne.jp/koichik/
264250:04/10/16 21:19:57
>>263
おお。日記の人ここ見てたんだ。
http://d.hatena.ne.jp/koichik/
解説ありがとう。
265デフォルトの名無しさん:04/10/16 21:46:22
結局、どういう場合に結合ひっぱってきてくれないんだろう?
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からデータひっぱってきてくれるんだけど。
266デフォルトの名無しさん:04/10/16 22:07:17
>>263
ぐはぁっ

>>257
http://d.hatena.ne.jp/koichik/20040826#1093545210

>>265
ひっぱってきてくれるけどSQLはN+1回出てるはず
q.list()で1回とgetUserData()ごとに1回
それを避けたい場合の話
267263:04/10/16 22:14:55
ま、Virtualizationやhand-written SQLサポートなんかの説明を「Hibernate3入門記」で書いてくれるはずなのでヨシとするか。
268デフォルトの名無しさん:04/10/16 22:25:29
>>266
> ひっぱってきてくれるけどSQLはN+1回出てるはず

え、1回でやってるけど・・・と思ってSQLのログよく見たら、joinしてない。
でもgetUserDataごとにあるはずのSQLがログに出てない。
なんでだ?と思ったら、直前にCriteriaを試してたので、そのキャッシュを使ってるらしい。

ということで、1件ごとにSQLを発行するのが問題なければOKだけど、joinしたければ明示的に記述
しろ、ってことか。
269デフォルトの名無しさん:04/10/16 22:32:49
最近Hibernateスレと化しているな。
270266:04/10/16 22:58:13
>>267
ぐはぁっ
気が向いたら頑張りまつ.

それから266に書いた257は256の間違いです.
271デフォルトの名無しさん:04/10/16 23:12:27
>>270
よろしこ

Criteriaの件数数えたいときにはどうしたらいいんだろうね。
HB-474にVoteするしかないのかな?
272デフォルトの名無しさん:04/10/17 05:54:09
ぐはぁっ

て、うざすぎ
273デフォルトの名無しさん:04/10/17 06:39:08
これにvoteするか、Christian Bauerをうならせる解決策を呈示すれば許す。
ttp://opensource.atlassian.com/projects/hibernate/browse/HB-474
274デフォルトの名無しさん:04/10/17 11:32:28
>>272
orz

>>273
voteしたから許して。
でも、ちょっと見た感じCOUNTだけでAVGとかは無理?
GROUP BYやHAVINGも?
別の手も欲しいかも。
275デフォルトの名無しさん:04/10/17 18:09:14
>>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
276デフォルトの名無しさん:04/10/17 23:18:35
iBATIS派の人が喜ぶかもしれないシンプルなO/Rマッパー
http://orbroker.sourceforge.net/

任意のSQLが書けるのがiBATISとの共通点で、
使用するクラスがbeanでなくても良い(任意のクラスでよい)
のが売りみたい。
277デフォルトの名無しさん:04/10/17 23:20:14
しかし選択の幅が広がるのは良いものの、こんだけ増えてくるとそろそろ
つかれてくるな....
278デフォルトの名無しさん:04/10/17 23:40:54
OODBに移るまでの辛抱なのかのう…?
279デフォルトの名無しさん:04/10/18 01:20:41
RDBからOODBに移るということはもはやありえないし、選択の幅が増えるといっても現実Hibernate3かEJB3で落ち着くから問題なし。
280デフォルトの名無しさん:04/10/18 10:20:57
Cayenneも結構いいと思うんだけどなあ。
281デフォルトの名無しさん:04/10/18 15:40:23
Cayenneって、どこがいいの?
282デフォルトの名無しさん:04/10/18 16:52:57
モデラー付いてるしな。
あとは好みだろ。
283デフォルトの名無しさん:04/10/18 18:41:08
Hibernateも、Middlegenと組み合わせればいいだけだし。
実際の開発に入れば、モデラーより、どんな強力で柔軟性のあるマッピングしてくれるかの方が大事だと思うけど。
284デフォルトの名無しさん:04/10/18 22:34:56
Cayenneのドキュメントを読んでると、Enterprise Object Frameworkの引き写しにしか....
だってEOFのドキュメントと同じようなこと書いてあるんだもん。
285デフォルトの名無しさん:04/10/18 22:58:07
>>284
や、はなからそういう「オープンソース版の EOF」みたいなのを目指して
作ってるんじゃなかったっけ....?
おれはむしろその思想に興味を持って使いはじめたクチです。
で、後から WebObjects も買ったけど、いまでは Cayenne しか使ってない(笑)
286デフォルトの名無しさん:04/10/19 01:23:54
で、Cayenneってどこがいいの?
287デフォルトの名無しさん:04/10/19 01:50:59
288デフォルトの名無しさん:04/10/19 02:18:37
>>287
そこに書いてあるCayenneのいいところって、GUIツールが付属ってとこだけじゃん。
あとのサンプルは、HibernateのCriteriaでも同じようにできることだし。
GUIツール使いたければMiddlegenがあるわけだから、Cayenneの特徴がよくわからん。
289デフォルトの名無しさん:04/10/19 02:41:13
>>275
なるほど。
いわれてみればHibernateのCriteriaって、
session.createCriteria(Cat.class)
という使い方をするように、
「永続オブジェクト(この例ではCat)のリストを取得する」
ことが主目的で(例外はALIAS_TO_ENTITY_MAPを使った場合)、
任意の結果を得たければHQLを使えということか。
だからSELECT句を指定する手段が無くて、そのために
GROUP BYで破綻するのかも。
対応を考えるのは悩ましいね。
290デフォルトの名無しさん:04/10/19 02:50:15
>>288
ハイバネート触ったこと無いんでよく分からんが、
JavaコードかDBスキーマがまずありきで、それをマッピングを介して
変換する感じでしょ?
どっちもない場合にマッピングを書いてコードとスキーマを生成する場合は、
手書きでマッピング書かないといけないの?

Cayenne の場合、DBスキーマありきでリバースしてクラス作るのもありだけど、
GUIモデラでモデリングして、そこからコードもDBスキーマも生成する、
ってのが取っつき易いかも。
(モデラが吐くマッピングファイルは XML だから手編集も可能)

まー正直 GUI モデラがまだ貧弱でもっと進化しないとだけど、
どっちも似たり寄ったりってことでいいんじゃねーの。
国内ユーザ数はハイバネートの方が多そうだから、どっちでも良ければ
ハイバネート使っとくといいんでは。
291デフォルトの名無しさん:04/10/19 04:07:19
現実問題として、まずDBありきだからね。
ボトルネックになることが多いのはDB側の処理だし。
で、DBのスキーマを生成するツールはそれこそゴマンとある。
ExcelでDB仕様から生成するマクロ組んでるところも多いだろうし。
Hibernatorだかなんだか、マッピングをまず作成するツールもあるし。
まあ、Hibernateを便利に使うツールは、探せばけっこうある。

問題は、Cayenneは主キーのフィールドを隠すので、かなりやりにくいってことだ。
それにマッピングで実現できない場合の、HQLのような逃げ道がないし。
実際はCriteriaよりもHQLが推奨のようだけど。
どっちも似たり寄ったりというには機能に差がありすぎ。
Cayenneに強いこだわりがない限りはHibernateを使うべきだと思う。
EJB3とのからみなど、将来性を考えてもね。
Hibernateは日本語版のドキュメントも出たしね。

で、Cayenneってどういうところに強いこだわりをもてるのかな、と。
292デフォルトの名無しさん:04/10/19 04:12:55
>>289
ただ、柔軟性を求めるのが難しいのなら、「バカチョン集計」つけて欲しいんだよね。
どっちにしろ複雑な集計はHQLでできるわけだからね。
今のままだと、簡単な集計でもHQL使わないといけない。
293デフォルトの名無しさん:04/10/19 10:13:28
Cayenneの目指すところは、設計の考え方からして、EOFと同じなんだろうね。
DBを覆い隠してしまってオブジェクトだけで操作する。そしてフレームワークの
中にあるものをあまり意識させなくて(XMLの書き方とか)、マッピングだけに
集中できるようにツールを用意する、などなど。

主キーをフレームワークが面倒をみるのがデフォルトというところも、EOFと同じ。
主キーの管理はデータの内容と結びつけるべきではない、主キーはDBの内部的
必要性のためにあるのだ、という考え方みたい。

TheServerSide.com見てても、ポイントは結局Cayenneのモデラーを使った
マッピング作成は、Hibernate+Middlegen+XDocletより簡単だ、というところ
みたい。「既存のDBをHibernateにマッピングするためにXMLをがりがり書いた
が、Cayenneを使うとすぐにできてしまった。それだけで価値がある」とか
いう発言がフォーラムにあった。

しかし一番の差は、HibernateはPOJOをDBにマッピングする技術、Cayenne
はDBをオブジェクトにマッピングする技術っていう、方向の違いじゃないか。
CayenneのデータオプジェクトはすべてDataObjectのサブクラスになるわけ
だし。
294デフォルトの名無しさん:04/10/19 13:48:22
>>291
周辺ツールが充実してるのはいいことだと思うけど、
最初からオールインワンで使えるほうがもっと良くない?
HQL のような逃げ道は、おれとしてはそういうの書きたくなくて
O/R マッピングフレームワーク使ってるところがあるから
そもそも好きじゃないんだけど(笑)、
SQLTemplate ではダメかな?
http://objectstyle.org/cayenne/userguide/fetch/sqltemplate.html

結局、多少泥臭くても柔軟な方が好きな人は Hibernate がしっくりくるだろうし、
多少不自由でも抽象化されたずっぽしオブジェクトな世界が好きな人は Cayenne が
しっくりくるんじゃない?
一つのテーブルから継承関係にあるクラスを作ったりする機能なんて
けっこう面白げだと思うんだが。
http://objectstyle.org/cayenne/modelerguide/modeling-object-layer/inheritance.html
295デフォルトの名無しさん:04/10/19 17:08:03
好き嫌いというよりも、現実マッピングだけじゃまかなえないものが多いんだよねぇ。
マッピングが貧弱でSQLテンプレートばっかり使うならiBatisやS2DAO、SpringJDBCの方がいいんじゃないかとも思うしね。

継承のマッピングは面白いんだけど、Hibernateでもできそうな気配。
ttp://www.hibernate.org/hib_docs/reference/ja/html/inheritance.html
296名無しさん:04/10/19 18:12:29
>>295
Cayenne はマッピング貧弱なの?
297デフォルトの名無しさん:04/10/19 19:30:56
色々考えた上でSQL書くのが楽しい俺なんかはどうする

まー、クソ設計だからそうなるんだがな
俺が設計したワケじゃないからしゃーない
298デフォルトの名無しさん:04/10/19 20:00:56
俺もごちゃごちゃした集計する会計の帳票とか
一発SELECTでもってきて、わー早くなったーとか喜んでる
SQL大好き野郎なんで、S2Daoはちょっと使ってみたく思っています。
299デフォルトの名無しさん:04/10/19 20:58:01
>>296
貧弱ってことばはふさわしくないかもしれないんだけど、すべてが賄えるほど強力じゃない。
ひととおりは揃ってるんだけどね。
ちょっとみた感じHibernateのCriteriaと同等みたいだから、優位性が。
HibernateならHQL使えるから、Criteriaが強力である必要があまりないんだよね。

というかSpringとかSeasarのサポートがない時点で、使うの萎える・・・。
300デフォルトの名無しさん:04/10/19 23:03:44
俺の場合は、何でもフレームワーク側でやろうとするのは無駄な労力かかって
本末転倒だと思ってるんで、複雑な結合とかはビュー作って、
フレームワーク側からはもうほとんど1テーブルそのまま持ってくるのと
親子関係にあるレコードを toHoge() で取り出すくらいしかやってないなあ。

どんな道具も万能じゃないんだから、適所適材ってことじゃないすかね。
301デフォルトの名無しさん:04/10/19 23:35:26
Cayenneどうよって思ってるのは、その適所が、Hibernateの適所に完全に含まれているんじゃないの?ってこと。
Cayenneが使えるところであればHibernateは完全に使えるけども、Hibernateが使えるところでもCayenneは使えないことのほうが多い、と。
302デフォルトの名無しさん:04/10/19 23:36:32
じゃ黙ってHIBERNATE使ってりゃいいぢゃん。
303301:04/10/19 23:37:01
思っているだけで、実際そうなのかはわからないから、Cayenne使ってる人に聞いてみたいんだよね。
304デフォルトの名無しさん:04/10/20 00:12:08
( ゚д゚)ポカーン
305デフォルトの名無しさん:04/10/20 03:07:10
>>292
こんなのどう?
ttp://d.hatena.ne.jp/koichik/20041019#1098208806

これでもcountのmaxとかはできないけど。
HQLのBNF見たらそんなのできるようになってなかったから。
306292:04/10/20 03:38:12
>>305
乙。
HQL生成するんだね。
いいかも。
Expressionは欲しいときに自分で実装と。そしてここに貼り付ける、と。

本家のCriteriaってこういうことできるようになる気配はないんだろうか・・・
307デフォルトの名無しさん:04/10/20 19:48:01
Criteria使ってdistinctな検索ってできますか?
関連テーブルのせいで、同じのがいっぱい取れて・・・。
308デフォルトの名無しさん:04/10/21 01:02:25
>>306
3.0alphaでも変わり映えしないみたいね。

>>307
setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
309デフォルトの名無しさん:04/10/21 12:32:53
O/R Broker - JDBC Framework
ttp://orbroker.sourceforge.net/
310292:04/10/22 15:19:25
>>305
> > Another option would be to have a parallel hierarchy
> > of HQL based Criteria objects. This may be the
> > easiest way to get started, and this way we could see
> > if it was feasible before committing to it. I would
> > be happy to take a go and doing a first pass myself.

> That sounds really ugly.

斬って捨てられてますな。

ttp://sourceforge.net/mailarchive/forum.php?forum_id=7517&max_rows=25&style=nested&viewmonth=200401
311デフォルトの名無しさん:04/10/24 13:08:00
Hibernateで継承使ってみた。
こいつはいいよ。
SQLテンプレートではなくマッピング使うメリットとして大きいかも。
例えば、memberテーブルのtypeフィールドによって処理が違う場合をポリモーフィズムで実現できる。
それとmemberテーブルとpurchaseテーブルは1-多なんだけどpurchaseテーブルに登録できるのはtypeが2のときだけ、とかをJavaの型で保証できる。
312デフォルトの名無しさん:04/10/24 13:14:16
ただし、継承関係にあるとき以外は継承を使わないこと。
当たり前だけど、念のため。
313デフォルトの名無しさん:04/10/24 14:42:39
typeの値を変更する処理は行いにくいけど、そもそもtypeを変更する処理が必要な場合には、それは状態なので継承をつかっちゃだめ。
314デフォルトの名無しさん:04/10/24 21:19:39
Hibernateのone-to-oneを使うと、レコード読み込むたびに関連テーブルへのselectを行うんですが、これをオンデマンドで行う方法はありますか?
315デフォルトの名無しさん:04/10/24 21:57:46
レコード読むたびにselectするのはオンデマンドじゃあないのか?
316デフォルトの名無しさん:04/10/24 22:52:34
必要ないときもselectするから、オンデマンドじゃないんですわ。
317デフォルトの名無しさん:04/10/24 23:36:55
HQLだとjoinになってくれた。
318デフォルトの名無しさん:04/10/24 23:53:04
と思ったらキャッシュにだまされていた。
319デフォルトの名無しさん:04/10/25 00:47:36
対1関連の場合、プロパティに無条件にProxyをセットするとか出来なくて、
それをnullにするか関連先のオブジェクトを設定するかしないといけないから
どうしようもないような。
関連を外すか、関連先を使わなくてもfetch joinする方がいいかも。
もしかするとHibernate3にプロパティレベルでのlazy initializeみたいな
ことが書いてあったので、それが解決策かも?
320デフォルトの名無しさん:04/10/25 02:36:28
fetch join してもいちいちselectしてる・・・
なんでだろう。
321デフォルトの名無しさん:04/10/25 04:55:30
うーん、proxy使ってみたら、確かに最初のSQLは一回しか発行されてないんだけど、そのときは主キーしかとってきてない。
だから、レコード使うときに主テーブルと副テーブルの両方への問い合わせで、あわせて2問い合わせを発行してしまう。
全然意味なし。むしろSQLの発行量が倍。
同じコード/マッピングのままHibernate3alpha使ってみたけどいっしょ。
なんかコードかマッピングか変更したらいけるんだろうか。

それにしても、one-to-one使ってる人は、実際どうやってるんだろう。
322デフォルトの名無しさん:04/10/25 05:56:14
主キーしか取ってきてないって、もしかして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
324デフォルトの名無しさん:04/10/25 14:30:57
やっと解決。ってか解決しないことがわかった。

副テーブルが主テーブルとは違う主キーを持って、別に外部キーを持つようにして、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になりましたです。
325デフォルトの名無しさん:04/10/26 02:30:19
蛇足ですが…
1対1で外部キーを使う場合はなぜかmany-to-oneを使うことになってます。
リファレンスの例もそうなってる。最初は間違ってるんだろうと思ったけど
Hibernate in Action に解説があった。orz
326デフォルトの名無しさん:04/10/26 02:36:11
>>325
それってなんでなん?
327デフォルトの名無しさん:04/10/26 02:54:06
「驚いただろ? でもな,Hibernateにとってはone-to-oneもmany-to-oneも大差ないんだ」
くらいにしか書いてない。
気持ち悪いけどそういうものだと憶えるしかないらしい。
328デフォルトの名無しさん:04/10/26 03:07:22
まあ、実質、副テーブル側からみればmany-to-oneかone-to-oneっていうのは外部キーがユニークであるかどうかってだけで、1レコードを見ればどっちでも同じだからねぇ。
でも、大差ないならone-to-oneにしてくれればいいのに。
329デフォルトの名無しさん:04/10/26 07:47:28
・・・こんどは、lazyにするためにconstrained="true"にすると、追加ができないことに気づいた。
one-to-oneって、すごく使いづらい気がする。
主テーブルのキーはsequenceで、副テーブルのキーはforeignにしてると、まず主テーブル側を追加しようとすれば副テーブルデータが永続化されてないので怒られ、副テーブル側を追加しようとすればキーが決めれないので怒られ。
それではと主テーブルのcascadeをsave-updateにすると、先に副テーブルのデータを追加するもんで、そのキーが主テーブルにないのでデータベースに怒られ。
330デフォルトの名無しさん:04/10/26 08:53:56
結局主テーブル側でone-to-many、副テーブル側でone-to-oneにすることでつつがなく解決。
331デフォルトの名無しさん:04/10/27 21:43:04
質問です.

joined-subclassで,Hoge <-- SubHogeと継承を定義して,

session.find( "from Hoge h where h.class = SubHoge ");

で検索すると, なにも返ってこないのですが,discriminatorを定義した
subclassじゃないと使えないのでしょうか?

HQLを使って,HogeクラスのSetを下位クラスの型でフィルタしたいの
ですが,うまい書き方があれば教えてください.

下記リファレンスを参考にしたんですが…

ttp://www.hibernate.org/hib_docs/reference/en/html/queryhql.html#queryhql-where

from eg.Cat cat where cat.class = eg.DomesticCat
332デフォルトの名無しさん:04/10/27 22:03:36
from SubHoge
だとうまくいかないんですね?
333デフォルトの名無しさん:04/10/27 22:38:36
>>332

from SubHoge

だけであれば,SubHogeの全インスタンスが問題なく戻ってきます.
具体的にやりたいのは,

HogeのサブクラスSubHogeA,SubHogeBがあり,
SubHogeBとHogeにmany-to-manyの関連を定義.

あるSubHogeBに関連する,SubHogeAの全インスタンスを
列挙する って操作です.

SubHogeBから関連をたどって,HogeのSetを取得,A,Bに分類した
上で,Bについては,再帰的に探索する,という感じに考えていたんですが.
334デフォルトの名無しさん:04/10/30 02:26:43
>>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
335デフォルトの名無しさん:04/10/30 06:46:02
>>334

ありがとうございます.マッピングファイルはXdocletで生成しているので,
並び順に頼るのも難しいです.

結局,idを条件に使うことで解決しました.

from Hoge h SubHoge s where h.id = s.id

336デフォルトの名無しさん:04/11/05 02:46:02
Cayenne 1.1 RC2が出ました
http://www.objectstyle.org/cayenne/
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
338デフォルトの名無しさん:04/11/15 22:09:15
>>337
findとかloadしたオブジェクトとは
「別のインスタンスだけど、主キーが同じもの」を作って
それをupdate/deleteしてないかい?
339デフォルトの名無しさん:04/11/16 11:40:05
>>338
返信ありがとうございます。

たしかに、別のインスタンスで主キーが同じものを作っています。
ということは、update/deleteをする場合は、一度ビジネスロジック側で
loadなりfindなりして、インスタンスを生成し、それに対して変更する
値をセットするという形の実装になるのでしょうか?
340338:04/11/16 21:32:10
>>339
うん、updateの場合は、そうだよー。


で、ごめん、deleteの場合は、
主キーさえ合ってたら(他の値に関係なく)削除される、だったはず。
341デフォルトの名無しさん:04/11/16 21:45:46
結論:Liquid Data
342デフォルトの名無しさん:04/11/17 01:07:03
>>339
まず、Session#update()はいわゆるオブジェクトの更新ではない、
ということに注意。
update()は、以前に別のセッションで取得した永続オブジェクトなどを
現在のセッションに関連づけるために呼び出すもの。
結局は更新されるんだけど、単に更新するだけならfind()等で取得した
永続オブジェクトのプロパティを変更すればいいだけ。
update()を呼ぶ必要はない。

もし、339が生成したオブジェクトの内容をHibernateに
更新してもらいたいのなら、update()を呼び出すのは間違いとは
言い切れない。
しかし、残念ながらそのセッションで同じ主キーを持った
永続オブジェクトをfind()等で取得済み(自覚ないみたいだけど)
なので例外が吹っ飛んでくる。

更新したければ,
セッションから取得したオブジェクトを変更するか、
セッションで取得したのと主キーが重ならないのをupdate()に渡すか、
二つに一つ。
343デフォルトの名無しさん:04/11/17 01:07:33
>>340
delete()でも同じセッションに主キーが同じ永続オブジェクトがあると
その例外が吹っ飛んでくるよー。
344デフォルトの名無しさん:04/11/22 15:21:23
345デフォルトの名無しさん:04/11/25 03:05:53
知らない間に、ibatisがApache Incubator入りしていますよ。
http://incubator.apache.org/projects/ibatis.html
346デフォルトの名無しさん:04/11/25 08:49:22
うわ、ほんとだ。Apache iBatisになるのか。結構好きなORマッパなので、その方が
名を知られそうでいいように思いますね。
347デフォルトの名無しさん:04/11/26 02:01:08
> 346
同感。
個人的にHibernateとかの大がかりなO/Rマッピングソフトより、
やる事が単純な分、使いやすくて、理解しやすいのがいい感じ。

名前が売れて、メジャーになってくれれば、
プロジェクトで採用しやすくなるので、今後が楽しみ。
348デフォルトの名無しさん:04/11/26 02:14:29
名が売れてといえば、UNIXの開発で、オープンソースなリソースは使うなって
いいつつApacheはOKってなところがあった。
まあHTTPサーバだけを指してるんだろと思ったけど、話してるとApacheが
HTTPサーバ以外も出しているってこと自体をよく分かってなかったみたい。
もしかしてApache iBatisという名前ならおkが出るんだろうかw
349デフォルトの名無しさん:04/11/27 14:49:12
apacheの一部ですって言ってあげたら?
せっかく誤解してくれてるんだから。
350デフォルトの名無しさん:04/11/27 22:13:06
アノテーションぶりぶりのS2DaoよりiBatisのほうが初期学習コストが低そう。
頭の中身がレガシーな漏れの同僚たちにも受け入れられやすいと思う。
351デフォルトの名無しさん:04/11/28 01:37:33
もう、Hiberanteでいいよ。
XDoclet1.2.2でhibernate.cfg.xmlもつくれるし。
352デフォルトの名無しさん:04/11/28 23:01:14
HibernateのHQLってFromにインラインビュー使えないんだ。
Group Byの集計単位が異なるテーブルを外部結合したい時とかに
個別に全行Fetchしてから自前ハッシュ結合しなきゃいけないのか・・・。

なんかMySQL使ってるみたいで鬱になる(´・ω・`)ショボーン

その辺をDBに依存せずに書けるようになるといいんだけどなぁ。
結合するまでWhereで行数減らせなくて、さらに行数の予測ができない
場合だと致命的かも。こういうの業務系だと頻繁にあるし。

こういう制限ってどうやって対処してんの?>Hibernate使いの皆様
353デフォルトの名無しさん:04/11/29 00:04:40
>>352
俺はハイバネート使いではないが、ある程度複雑な SQL になったら、無理矢理
プログラム側でどうこうしようとしないで DB 側に View 作ってるよ。
何でもかんでもプログラムで実現するのはムダな努力だと思う。
楽するためのもので苦労する必要はないだろう。適所適材で。
354デフォルトの名無しさん:04/11/29 00:34:54
Java使いはSQLが嫌いなのれす
355デフォルトの名無しさん:04/11/29 01:24:53
>>352
ORマッピングは、複雑なSQLをどうにかしてくれるもんじゃないからねぇ。
356352:04/11/29 01:30:00
>>353
それしかないよなぁ・・・。

割り切ってしまえば問題はないんだけど、Unit Testを
HSQLDBでテーブル作成から行って、実稼動はOracleなんて
構成にしようと思うと、DBに依存するとやりづらくなるから。

あれ?HSQLDBってそもそもインラインビュー使えんのか?
357デフォルトの名無しさん:04/11/29 01:42:11
母さんはそんなこと知りません!
ごちゃごちゃ言ってないで早く寝なさい!
358デフォルトの名無しさん:04/11/29 01:55:11
そこでS2Daoですよ
359デフォルトの名無しさん:04/11/29 03:32:58
>>358
SQL厨にマッチするのはiBatisでしょ。
360デフォルトの名無しさん:04/11/29 20:43:05
>>356
さすがに無理がないかい?
テストのためにアーキテクチャをひずますのも本末転倒だし。
361デフォルトの名無しさん:04/11/29 22:22:05
>>356
hsqldbのユーザーマニュアルの、SELECTの項を見る限りでは、使えるように思える。
FROM句の次に「sqlstatement」って書いてあるし。
362352:04/11/30 01:07:56
>>359
それが嫌だからO/Rマッピング使いたいんじゃん。
でも、O/RマッピングがSQLと比べてまだまだ貧弱だってこと。

>>360
そんな無理あるのかな?

現状は無理でも、DBへの依存を断ち切ることはO/Rマッピングの
究極の目標なんじゃないのかって思ってるんで。

開発環境のDBってゴミデータに埋もれがちで、動かないのが
データのせいなのか、プログラムのせいなのか解析するのに
手間がかかることよくあるし。

DBを扱う場合のUnit Testって、データまで含んで完結するしさ。

それに、複数環境で動かせられるってのが必須って要件は少ないと
思うけど、可能にできるならば品質の向上にも効果あると思う。
363デフォルトの名無しさん:04/11/30 02:04:59
DBUtilsが軽めで分かりやすくていいと思ったが、
where句の条件式がコロコロ変わるようなのだと
キツいかと思った。

SELECT * from Employ WHERE name=? or tel=? or ・・・項目いっぱい

みたいので、telが存在しない場合は条件式に含めない、となると同じようなSQLをプロパティファイルに
いっぱい記述するかWHERE句だけ動的に生成するか。で動的に生成するとせっかくSQLを
外部ファイルに出している意味が激減。

iBatisなんかはどうなんでしょう。
364デフォルトの名無しさん:04/11/30 02:07:43
>>362
DBのUnitテストはDBUnitを使えるときは使ってますが
362タンはどうしてます?
DELETE INSERT でテストデータを投入するのはUnitテスト的には
かくあるべきと思うのだけれどもテスト用スキーマを作らせてくれない
環境だと使えない。
365デフォルトの名無しさん:04/11/30 03:11:36
Hibernate 2.1.7cってのがリリースされています。
ttp://www.hibernate.org/30.html

Cayenne開発版は1.2 M1になってますね。
ttp://objectstyle.org/cayenne/release-notes/RELEASE-NOTES-1.2M1.txt

CayenneってV1.2でID列(自動インクリメントの列)をサポート
するみたい。リリースはまだまだ先でしょうけど。
366デフォルトの名無しさん:04/11/30 10:53:35
>>362
> 現状は無理でも、DBへの依存を断ち切ることはO/Rマッピングの
> 究極の目標なんじゃないのかって思ってるんで。

現実的に無理だね。
DBに進化を止めてもらわないかぎりは。
構文的に問題なくても、DB機能の違いが多すぎる。
ORマッピングは、DBを考えなくてよくするしくみではなく、DBはDBで、JavaはJavaで考えれるようになるしくみだし。
良くも悪くも、単なるマッピングだよ。ラッパーじゃない。

それにここで問題にしてるのは、マッピング機能ではなくて、HQLの表現力という話だね。
環境依存SQLをラップする共通言語が欲しい、HQLにその役割をもって欲しいってことでしょ?
367デフォルトの名無しさん:04/11/30 11:18:03
iBatis、S2DaoのスタンスはSQLが環境依存なら、SQLをそのままJavaオブジェクトに
マッピングしてまえっ、って感じか。ORマッピングというよりは、Object-SQLマッピングという感じ?
368デフォルトの名無しさん:04/11/30 12:44:00
>>362

> 現状は無理でも、DBへの依存を断ち切ることはO/Rマッピングの
> 究極の目標なんじゃないのかって思ってるんで。

DBに依存しないのに、何故OとRをマッピングする必要があるのかと。
素直にOODBを作ったほうがいいんじゃないかとさえ。
369デフォルトの名無しさん:04/11/30 20:51:03
>>363
iBatisは動的なSQLが可能。
if これが0以上ならとか
370デフォルトの名無しさん:04/11/30 20:54:29
>>368
俺もそう思う。オブジェクト指向かXMLでやるのが自然だな。
現在のO/Rマッピングはあくまでマッピングだから、RDBMSが持つようなスケジューリングの最適化機能なんてのは無い。
もしあったとしても特定のRDB製品限定にならざるおえないから、O/RマッピングツールのどのRDB製品でも同じようにっていう概念と相反してしまう。
371352:04/11/30 23:57:53
>>363
DBUtilsはゴミだな。
名前付きパラメータすら使えないし、型マッピングが固定だし、
パラメータにnull渡せないし、コネクション引っ張りまわすか、
毎回DataSourceから取得する作りだし。

実際使ってる人がどうやってるか知らないけど、まともに
使えるようにするには相当被せなきゃだめっぽい。

>>364
DBだけってのはあきらめて、ロジック側でデータ足したり
しながらやってるよ。テスト終わったらRollbackして。

>>366
>それにここで問題にしてるのは、マッピング機能ではなくて、HQLの表現力という話だね。
>環境依存SQLをラップする共通言語が欲しい、HQLにその役割をもって欲しいってことでしょ?

話ずれたけど、主題としてはこれを言いたかった。
DBってあまりに標準ってものがなさ過ぎるから。

そのためのツールとして、現時点では理想と現実の折り合いで
一番センスいいな、と思ってるのがHibernateだから、
多くのDBで普通に書けるSQL程度はサポートして欲しい、と。

>>368,370
究極の目標って書いたのは、DBの持ってる機能は最大限利用しつつ、
それを意識せずに使えて、十分なパフォーマンスが得られるってことだよ。
その時にはO/Rマッピングとは呼ばなくなってるかもしれないけど。

ちょっと極論すぎてぼやけてきたんで、どうでもいいけど。。
372デフォルトの名無しさん:04/12/01 00:07:13
ORマッピングとまたその上のレイヤーを組み合わせたフレームワークがあればいいんだろうけど。
でも、やっぱりリレーショナルモデルとオブジェクトモデルという異なったモデルを使う以上は、完全なラップは無理そうだ。

アプリケーションを高度に部品化すれば、DBを意識しなくてもよくなるだろうけど、そんときはORマッピングどころの話じゃないしね。
373デフォルトの名無しさん:04/12/02 11:04:24
>>364

>>362じゃないけど、
環境標準のテストデータを整備して、
setUpメソッドで、自分のテストデータを投入して、
tearDownメソッドで、標準のテストデータを投入するのはどう?

あるいは、setUpメソッドで既存のDBデータを読み込んでIDataSetに格納して、
tearDownメソッドでDELETE_INSERTするとか。
(えらく時間がかかりそうだし制約とかがからむとヤバそうだが)

スレ違いかも・・・スマソ
374デフォルトの名無しさん:04/12/06 23:47:54
xdoclet の @hibernate.collection-key-column がうまく動かない。
http://opensource.atlassian.com/projects/xdoclet/browse/XDT-1161
解決法知ってる人いたらきぼんぬ。

top-down で開発するつもりだったけど、@hibernate 書いて xdoclet 動かして、
想定通りの hbm.xml が生成されてるか確認するぐらいなら、
最初から hbm.xml 書いた方が楽だと思った。middle-out で開発しようか思案中。
375デフォルトの名無しさん:04/12/07 01:05:45
>>374
たぶん、それだとJavaコードの自動生成とかDBの自動生成で不満がでるんじゃないかと。
XDoclet使うのがいやなら、テーブルは別に作って、Javaコードとhbm.xmlを別々に書いたほうがいいと思う。
どちらにしてもテーブルは自力で作って、一発目のクラスとhbmはbottom-upで作った方がいいと思う。
あとは、XDocletを使ってJavaコードだけをいじるか、Javaコードとhbm.xmlを別々にいじるか、にしたほうがいいと思われ。
376デフォルトの名無しさん:04/12/07 13:58:33
商用製品だけど、TopLinkってどう?

マニュアルとか見てみたけど、ORMの機能は
十分揃ってそうだし、GUIのマッピング
ツールもよさげ。値段、高いんかな。

http://www.oracle.com/technology/products/ias/toplink/
http://otn.oracle.co.jp/products/ias/toplink/
377デフォルトの名無しさん:04/12/07 23:32:18
>>376
これに入ってるらしい。
http://www.sourcenext.com/products/oracle_jd/
378デフォルトの名無しさん:04/12/08 00:51:15
TopLink、結構いいですよ。
商用だけあって、GUIとかマニュアルとか
ちゃんとしているし。
RDBMSがOracleしか選択しないのであれば、
悪くない選択だと思います。

Oracle以外のRDBMSでも動くけど、
サポート面が恐いよな。
379デフォルトの名無しさん:04/12/08 03:06:07
Cayenne 1.1 Final キター!!
ttp://objectstyle.org/cayenne/
ttp://www.theserverside.com/news/thread.tss?thread_id=30414

SQLTemplate (think iBatis inside an ORM, without XML in queries, editable via GUI), distributed caching, expression parser, inheritance mapping, professionally looking Modeler, etc.

SQLTemplateっていう新機能でiBatisのように、
任意のSQLが投げられる、しかもGuIで作業できるって事か?

380デフォルトの名無しさん:04/12/08 03:11:48
Hibernate3にも実装されるし、SQLテンプレートは必須ってことだね。
381352:04/12/08 10:51:49
>>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
383374:04/12/08 22:37:20
>>381
@hibernate.collection-key の column は省略不可って
書いてあるから、試してないけど、今度試してみます。
middle-out に移行したので、すぐには試せないけど…

つーか、buttom-up で @hibernatedoclet 吐いてるのって、
middlegen だったのね。@hibernatedoclet 付の .java に戻すには、
中→下→中→上 と生成しなきゃダメなのか…。
384352:04/12/09 00:13:56
>>383
middlegenってcollection系は結構間違えたの吐いてたよ。
XDocletもキーや外部キーとかで一部の属性が無視されたり。
385デフォルトの名無しさん:04/12/09 12:08:24
素直にhbm書いたほうが一番楽ってこった。
DB仕様書から吐くマクロ作っておけば無問題。
386デフォルトの名無しさん:04/12/09 13:47:07
マクロつくるなら、マッピングクラスもついでに吐けばいいね。
387デフォルトの名無しさん:04/12/10 11:49:35
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回目。もうメリットを感じない。疲れた
391デフォルトの名無しさん:04/12/13 03:05:37
既存のものを移行するタイプの場合、既存DBの質にも寄るが
Hibernateはほとんどの場合使い物にならない
392デフォルトの名無しさん:04/12/13 03:53:38
>>390
どの辺で疲れたの?
393デフォルトの名無しさん:04/12/13 08:14:49
たぶんあれだろ
実際のプロジェクトでDBが最初にかっちりと決まっているわけではなく
コロコロ変わったりすることもしばしば
そのような状況の中、コーディング作業も同時進行しちゃうから
そのたんびに設定ファイル書き直しとかいうのがイヤなのでは?
結局、自分のところ自分で修正するならSQL(JDBC)直で書いてあるソースのほうが直しやすい
394デフォルトの名無しさん:04/12/13 09:02:17
>>393
それって、それなりの規模があるなら、SQL直で書いてあるソースのほうがいやになりそうだが。
DBのコロコロ変わる変更が、フィールド追加くらいのものじゃなく、構成として変わるような起こるようなら、ORマッピングがどうのじゃなく、その組織自体に疲れたってことじゃない?
ORマッピング使わないにしても、愚直にJDBCプログラムするのは、ただ手間がかかるわけで、なにか仕組み使うだろ。
395デフォルトの名無しさん:04/12/13 23:27:53
そこでiBatisですよ。
396デフォルトの名無しさん:04/12/13 23:48:49
EOF! EOF!
397デフォルトの名無しさん:04/12/14 02:40:38
>>395
それなら、Cayenneのが良さげ。
398デフォルトの名無しさん:04/12/15 00:50:09
基本的にビジネスドメインモデルとDBのモデル構造はちがう、マッピングできない
いろいろあるがこれが根本か、夢を見ていたおいらがあほだった。
あと、
Javaやって6年くらいになるが
・オブジェクト指向厨は運用や保守のことをまったく考えていない
・ソースを読まないオープンソース厨がおおい
・DBはJavaだけのものじゃない

でもiBatisは気になる。
399デフォルトの名無しさん:04/12/15 01:09:21
>>398
相当レベルの低いところでやってたんだね。
うつってるよ。
400デフォルトの名無しさん:04/12/15 01:33:37
そう、会社でまともなシステム開発は無理
気心知れた仲間内でサービスまでやるプロジェクト立ち上げ中。
おいらたちの合言葉
「仕事は適当に切り上げて、夢は家で見よう!」
60%くらいで働けばその辺のやつらの100%以上は十分働けるよ。
全開で頭使うのは会社以外で
401デフォルトの名無しさん:04/12/15 02:06:16
なんかDB->ビジネスドメインモデル->Strutsアクションフォームのこの
データのコピー処理作業がおそろしく無駄に覚えてきたStrutsで仕事な
今日この頃。

やっぱWebObjects + EOFみたいに、DBのモデルをそのままビューでも
使う、コントローラでも使う、モデルの変更は直接ビューに影響するって
のが楽でいいわ。
402デフォルトの名無しさん:04/12/15 03:30:17
>>398
> オブジェクト指向厨は運用や保守のことをまったく考えていない
それは OO は関係なく、単に厨だからでは。
403デフォルトの名無しさん:04/12/15 16:37:50
>>398
> ソースを読まないオープンソース厨がおおい

全体からみればオープンソースのソース読む方がむしろ奇特だと思われ。
404デフォルトの名無しさん:04/12/15 16:38:48
>>401
BeanUtils使うだけじゃだめなん?
405デフォルトの名無しさん:04/12/15 21:31:16
>>403
そうゆう輩がおおい。
たいてい、完全なマニュアルもサポートもないオープンソースを使うとき
ソースだけが頼り。
Hinernateのようにマニュアルがこれだけきちんとしているもののほうが珍しい
それでもソースは重要
OpenSourceってどういう意味や精神しってるかい?
昔はオープンソースプロダクトを使うとき必ずコンパイルしたものだ
406デフォルトの名無しさん:04/12/15 23:53:57
昔は昔。
今は今。

昔は、オープンソースは情報に敏感な一部の技術者が、趣味的にいじることが多かった。
今はオープンソース製品が広く認識されて、特に高いモチベーションを持つわけはない普通の技術者が業務としてオープンソース製品に触れるわけだ。

今はオープンソースと言っても、原理主義的オープンソースから、単にソースが公開されているだけのオープンソースまで、人々の認識は多種多用だし。
407デフォルトの名無しさん:04/12/16 00:25:46
LinuxやJavaを牽引する役目を背負ったオープンソース。
政治的思想を広めるという使命を背負ったオープンソース。
同好会的な内輪ノリのオープンソース。

人生色々、オープンソースも色々。
408デフォルトの名無しさん:04/12/16 09:23:23
>>405
>OpenSourceってどういう意味や精神しってるかい?
マニュアルを販売して、大儲け。
409デフォルトの名無しさん:04/12/16 10:59:48
>>408
ちがうよ、ちょっとした付加機能追加して、有償販売して大もうけ。
410デフォルトの名無しさん:04/12/16 12:47:06
基本開発に金だして、テストやサポート、バグフィックスはタダ働きのボランティア任せ
411デフォルトの名無しさん:04/12/16 13:03:57
オープンソースよりほしい漏れ専用クローズド彼女
412デフォルトの名無しさん:04/12/16 13:15:39
オープンソースで無料のほうがいいね。
ウィルス埋め込まれてたらやだけどね。
413デフォルトの名無しさん:04/12/16 20:21:55
>>411
上下の口もクローズド
入れさせません
414デフォルトの名無しさん:04/12/17 00:08:42
最近はこんなやつらばっかしだ。
問題がおきたとき情報集めてソース読んで対処するのはいつもおいら。
疲れたな
415デフォルトの名無しさん:04/12/24 01:17:45
ORM使うと、ビューとの兼ね合いが難しくならない?
ビューは使えなくなるね。
416デフォルトの名無しさん:04/12/24 01:58:38
?????
417デフォルトの名無しさん:04/12/24 03:14:56
ビューで書くか、マッピングの設定で書くか、迷える。
418デフォルトの名無しさん:04/12/25 13:50:06
>>414
問題が過ぎ去った後
自分の努力を誰も理解してくれない寂しい状況になる
419デフォルトの名無しさん:04/12/25 14:20:25
そんなクリスマス
420デフォルトの名無しさん:04/12/25 18:49:53
DBアクセスの速度を考えて、結局ビューにしてしまったクリスマス。
421デフォルトの名無しさん:04/12/25 19:37:26
そしてビューにした結果
詳細ドキュメントの修正を依頼されたクリスマス
422デフォルトの名無しさん:04/12/25 19:40:58
そんなクリスマス。

ところで、ビューってORMと共存しにくくなかった?
423デフォルトの名無しさん:04/12/25 19:42:16
ビューごとにマッピングオブジェクト作るっていうのはどうなんだろう?
424デフォルトの名無しさん:04/12/25 19:56:22
ここでいってるビューってなんなんだ?
425デフォルトの名無しさん:04/12/25 23:20:08
DBのViewでしょ。
426デフォルトの名無しさん:04/12/25 23:20:28
少なくとも、MVCのViewじゃないと思う。
427デフォルトの名無しさん:04/12/25 23:53:53
ORマッピングツールによるが、OR側でちゃんとリレーション定義してれば
問題なくORでいけるんじゃないか?
428デフォルトの名無しさん:04/12/25 23:54:56
429デフォルトの名無しさん:04/12/26 01:29:53
つうかね、DBを正規化しようものならパフォーマンスがどーのこーのって話になる
で、結局でかいプロジェクトになるとパフォーマンスでないから
夢見るきれいな形にはなってくれない
430デフォルトの名無しさん:04/12/26 13:17:51
>>424
ヨヨ「オレルスの仲間達!みなさんもちからを!」
「私に力を!強さをください!」

ヨヨ「ビュー……あなたも……お願い……」
「私、ビューには嫌われてる……」
「私がいることで、ビューをいやな気分にさせてしまう……」
「それは分かってるの……」
「でも……ビュー」
「貴方はやっぱりわたしの大切な人なの」

ヨヨ「いまだけでもいいの……わたしに……強さを!」
「あの頃のように!」

ヨヨ「ねえ、ビュー……もっとつよく、つかまってもいい?」
ビュー「……」
ヨヨ「もう……つかまっちゃった……」
431デフォルトの名無しさん:04/12/26 22:44:39
>>429
ちげーよ。きちんとした分析もせずに画面のデータが保存できりゃ
それでよしみたいな腐った非正規化された設計になってるからだろ。

どっかのSヨがExcelで作ったゴミDBを何度見たことか・・・。

非正規化すると、重複データをメンテナンスする必要性が出てきたり、
結局はマスタチェックしなきゃいけなかったりでデメリットも相当多い。

正確に分析してあるべき姿を論理設計
           ↓
パフォーマンスや簡略化のために非正規化

ちゃんとやってるプロジェクトってどれくらいあるの?
脳内で適切に非正規化できる奴は滅多にいない。
432デフォルトの名無しさん:04/12/26 23:38:15
正規化できる人も滅多にいません(T T)
433デフォルトの名無しさん:04/12/27 07:35:06
簡単な正規化すらできないのって理解不能だよな
434デフォルトの名無しさん:04/12/27 20:39:25
多分できないんじゃなくて、ぶったるんでてやる気がないんだろ。
435デフォルトの名無しさん:04/12/27 21:28:20
そういうやつは本気でやってもできない気がする
436デフォルトの名無しさん:04/12/27 22:23:26
>>434
それでいて残業はしっかりしていくんだよな。
437デフォルトの名無しさん:04/12/28 22:05:55
正確に分析してあるべき姿を論理設計
           ↓
パフォーマンスや簡略化のために非正規化
確かにこれはわかるが
この変遷についていけるマッピングFWがあるのか・・・
438デフォルトの名無しさん:04/12/28 23:24:56
>>437
その変遷どおりにマッピング変えればいいだけだよ。
ORMに幻想抱きすぎ。
SQLを変更するのと、どっちが手間がかかるか、安全か、天秤にかけて、適切な方を選べばいい。
439431:04/12/28 23:50:43
>>437
そうでもないと思うよ。非正規化が絶対に必要なのは一般に思われてるほど
多くないと思ってるから、むしろORMの機能をフルに使う事を前提にして
設計した方が綺麗に無駄なく作れるような気がする。

ERD上の関係より、コレクションの関係の方が詳細に限定されてるし。

あるべき姿の論理設計って、実際はかなり大雑把なもので、最低限必要な
属性しか持っていない概念的なテーブル構成にして、極端に詳細な要件は
省いて設計して、物理設計の時点で反映させるくらいでいいのかも。

パフォーマンスの点だと、単に結合するテーブルを減らす目的の非正規化って
無駄(マスタとの結合)を減らす程度の効果しかなくて、日次や月次バッチなりで
集計結果を先に計算して誤魔化す方が劇的な速度向上が得られると思う。
それには非リアルタイムになるってデメリットも出てくるけど。

チューニングって言っても、結局、「誤魔化す>>>無駄を減らす」なわけで。
440デフォルトの名無しさん:04/12/29 02:31:23
日次や月次の処理をごまかしだと捉えないほうがよいと思うが。
441デフォルトの名無しさん:04/12/29 02:35:52
つうか日次バッチや月次バッチは「当然考慮すべきこと」だろ。
442デフォルトの名無しさん:04/12/29 09:17:13
>>433-436
マジレスすると、そいつらには
「『正規化』という概念そのものが無い」
のですよ。

もちろん、オブジェクト指向とか、RDBとか、
そーゆー概念も無い。

【大型汎用機】とか【コピー句】とか、
そういった世界の人々が、ORマッピングの世界に流れてきて
カオスを生み出しているのが現状。
443デフォルトの名無しさん:04/12/29 10:27:05
最近思うに、RDBが対象である限り、この手のフレームワークは
どんどんシンプル化されて、

[RDBMS] ⇔ [必要なSQL投げ投げロジック。SQLは手書き] ⇔ [オブジェクト]

に収束する希ガス。。。
444431:04/12/29 13:19:40
>>440-441
それは受付キュー ⇒ 揃ったところで定時処理みたいな奴でしょ?
最初から処理可能時間が限定されてるようなのはまた別の話。

ただね、何でもかんでもバッチでって発想の奴多いからさ。
一度その前の綺麗な姿で設計すべきだろって言いたいんだよ。

パフォーマンスに関してのチューニングだと、

1) 無駄を減らす ⇒ インデックスの有効利用やプロシージャ化など
2) 誤魔化し ⇒ 時間かかる計算を先にして計算結果のみ利用など

この2種類のどっちかになると思ってるんだけど、どうよ?

>>443
現状でORMだけで完結できないのは同意。EJBQLもHQLも
貧弱だし、そのへんも結局SQLのラッピングだし。
445デフォルトの名無しさん:04/12/29 16:36:45
君らは「糞プロジェクト」の経験が無いから幻想に浸れるのだよ
要件定義の段階で業務のすべてを吸い出すことは出来ない
ようやく決まったと思ったら、他の担当の奴(顧客側)が突然首突っ込んできて
「ああ、それは違うよ 今はそう言うやり方ではない」と、打ち合わせている業務担当者でさえ知らない新事実が発覚する

ほんと糞プロジェクトだよ
446デフォルトの名無しさん:04/12/30 05:09:40
>>444
> 2) 誤魔化し ⇒ 時間かかる計算を先にして計算結果のみ利用など

こういうのを「誤魔化し」というのは、処理の時間方向での分散という考え方がしっかりできてないという証拠だと思ってしまうんだけど・・・
447デフォルトの名無しさん:04/12/30 05:30:53
テーブルが単純に1つのクラスにマッピングできるようなシステムだと、ORMはあまり必要ないかもね。
448431:04/12/30 12:51:26
>>446
ふーん。
じゃあ、事前集計の結果と、リアルタイム集計が同一だというの?

要件的に同一とみなして構わないってだけの話だと思うんだが。
近似値しか得られないのであれば、データ的に誤魔化してるじゃん。
449デフォルトの名無しさん:04/12/30 13:23:00
>>448
近似値を得ることを誤魔化しというのも、数とか計算についての考え方がしっかりできてない証拠だと思ってしまうんだけど・・・
450デフォルトの名無しさん:04/12/30 13:24:25
というか、近似値しか得られない日次や月次処理って、どんなぬるい計算してるの?
451デフォルトの名無しさん:04/12/30 13:26:00
> じゃあ、事前集計の結果と、リアルタイム集計が同一だというの?

いくらでも同一にできると思うのだが。
452デフォルトの名無しさん:04/12/31 11:37:03
事前集計の結果とリアルタイム集計の結果が異なっていたら
事前集計の結果を上書きするようにします。





というような改竄系の仕様の乱発を求める顧客の要望には
正直ついていけないというか罪の意識さえ感じてたりします。
453デフォルトの名無しさん:04/12/31 13:39:22
たとえば銀行の支店・本店間のデータ集計なんかで日次・月次データ
なしで何をやれと。
454デフォルトの名無しさん:04/12/31 13:51:18
リアルタイム集計と言いたいんだろうな。
455デフォルトの名無しさん:05/01/01 13:34:12
456デフォルトの名無しさん:05/01/03 13:23:40
事前集計と事前集計なしとでリアルタイム集計の差が出るようなプログラムが思いつかないんだけど、
457デフォルトの名無しさん:05/01/03 18:54:38
O/Rマッピング何ソレ
SQLガリゴリ書いて、Map配列
コレ最強
458デフォルトの名無しさん:05/01/04 02:07:25
カイエンは永続化オブジェクトが、カイエンのクラスに依存するのがどうも。。。
ま、Hibernateはその分、バイトコード弄りしてくれるわけだが。

iBatisのSQLMapはCommons DBUtilsまんまでぱくりやろ。
459デフォルトの名無しさん:05/01/21 00:00:22
ホシュ
460デフォルトの名無しさん:05/01/21 00:28:00
JavaPressにCayenne来ましたよ。
なんかほとんど紹介だけって感じだったけどさ...
461デフォルトの名無しさん:05/01/23 01:29:15
> 460
見てきたけど、ほんとに紹介だけって感じだった。
導入とGUIを使ってのマッピングと、簡単なデータ操作の方法という感じ。
Cayenneは、なかなかその次のフェーズの記事がでないな。。
462デフォルトの名無しさん:05/01/23 05:32:44
少し前のWebDB+でO/Rマッピングフレームワークの紹介、比較があったけど、
結局Toplinkが一番いいという話になっててちょっと笑った。
463デフォルトの名無しさん:05/01/28 01:27:58
eHibernate 3のbeta2が出た記念age
464デフォルトの名無しさん:05/01/30 18:22:06
Hibernateの安定版2.1.8も出ているな。(downloadサイトに)
465デフォルトの名無しさん:05/02/06 01:30:32
みんなHibernate派なんかな。
466デフォルトの名無しさん:05/02/06 02:14:24
おれはCayenne派だな。
467デフォルトの名無しさん:05/02/06 12:42:24
おれはiBatis派。
468デフォルトの名無しさん:05/02/06 14:08:32
俺は SQL 直接で満足してしまった派。古い地球人。
469デフォルトの名無しさん:05/02/06 17:42:06
>>468
そんなあなたにiBatis
470デフォルトの名無しさん:05/02/07 10:38:28
iBatisについて、わかりやすく解説したサイトってありまつか?
471デフォルトの名無しさん:05/02/07 10:48:19
アイバティス?
イーバティス?
472デフォルトの名無しさん:05/02/07 13:27:43
カタカナ表記するなら前者だと思うけど、英語での発音は中間くらいじゃない?
473デフォルトの名無しさん:05/02/07 22:36:17
>>470
雑誌で簡単な記事とかならあったけど、ネット上で日本語情報はほとんど皆無。

英語だけど、ここのSQL Maps Tutorial見ると、こんな感じかあってのが分かる。
http://www.ibatis.com/common/download.html

474デフォルトの名無しさん:05/02/08 01:22:31
英語では結構あるんだよな。これとか。

ttp://www.onjava.com/pub/a/onjava/2005/02/02/sqlmaps.html

とはいえ、本家のチュートリアルで十分かな。
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設計技法が変わって周囲からの抵抗が予想され.....
477デフォルトの名無しさん:05/02/09 02:39:05
Cayenne 1.2M2が出ているようですね。
478デフォルトの名無しさん:05/02/09 14:49:06
>>473>>474
ありがとうございます。
見てみます。
479デフォルトの名無しさん:05/02/10 07:45:45
hibernate の Criteria で select するときに、
紐付けされた別オブジェクトの属性で
ソートすることはできますか?
.add( Expression.eq( "master.name", new String("ほげほげ"))
で、検索条件として使うのはOKなんですが、
.addOrder( Order.asc("master.name") )
としてソート条件として使おうとすると実行時に例外となって
しまいます。
480デフォルトの名無しさん:05/02/10 19:57:37
>>479
master.nameはselectしてる?
そうじゃないとだめなDBもあるよ。

>new String("ほげほげ")
なんでわざわざnewしてんの?
481デフォルトの名無しさん:05/02/14 03:02:57
Cayenneに比べたらHibernateはショボイな。
482デフォルトの名無しさん:05/02/14 03:41:30
すごい自信だ
とりあえず、継承のマッピングはHibernateの方が強い。
483デフォルトの名無しさん:05/02/14 23:33:16
継承に強いのはいいが、派生クラスが多くなるとSQLがやたらと大きくなるのが気になる。
joined-subclassでマッピングしてるとそのぶんleft joinするからMySQLつかうと結構問題。
484デフォルトの名無しさん:05/02/15 00:12:30
まあ、継承のマッピングなんか、そこかしこでやるもんじゃないし。
485デフォルトの名無しさん:05/02/15 00:54:17
486デフォルトの名無しさん:05/02/15 02:15:29
>>484
しかし一番継承のマッピングするのはキモの部分だったりする
487デフォルトの名無しさん:05/02/15 10:30:52
>486
日本語のシンタックスエラー。"一番"の辺りに。
クエリーを投げなおしてください。
488デフォルトの名無しさん:05/02/18 14:18:15
489デフォルトの名無しさん:05/02/19 22:07:59
dbutileってレスポンス悪い??
490デフォルトの名無しさん:05/02/19 23:04:53
>>489
Bean 使ってる場合のリフレクション除けば、JDBC 直と変わらんだろ。
おまいの SQL が悪いか、コネクションプールしてないかだろ。
491デフォルトの名無しさん:05/02/19 23:39:49
>>489
一回のSQLで大量のデータを取得するときは、
遅いんじゃないの??
492デフォルトの名無しさん:05/02/20 00:21:34
>> 491
大量のデータをfetchした時は、そのデータをHDDから読み出したり、ネットワーク経由で送る時間の方がずっと大きいので、dbutilのオーバーヘッドなんか全然関係なくなるのでは。
493デフォルトの名無しさん:05/02/20 01:28:46
っつか、100万件とかヒットしたら、List に全部格納
されてまう。つくりの問題。
494デフォルトの名無しさん:05/02/20 01:42:08
>>493
Listじゃなくてiteretorで返すやつ低レベルAPIじゃなくてもう一皮ラップしたやつ用意してくれればいいのにね。
あと動的SQL対応。
495デフォルトの名無しさん:05/02/20 12:42:23
僕の場合、Hibernateはone-to-oneとmany-to-oneでlazyが効かない(Ver2.x)
のが一番の問題かな。Cayenneはこの辺どうなのかなー。

Hibernate3が待ち遠しい。
496デフォルトの名無しさん:05/02/20 17:20:51
>>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エミュレーションなプロパティを作る。
497デフォルトの名無しさん:05/02/21 22:07:00
>>496
dataは複数形。単数形はdatum。
以上、トリビアでした。

498デフォルトの名無しさん:05/02/21 22:29:50
Middlegenは規則名詞・不規則名詞かかわらずto-many関連のフィールドにはsをつける。
以上、トリビアでした。
499デフォルトの名無しさん:05/02/22 20:36:17
♪出会った頃は〜
以上、オリビアでした。
500デフォルトの名無しさん:05/02/22 22:16:07
ばぁちゃ〜ん、事故にあっちゃって、損害賠償で100万円いるんだよ〜
以上、オレオレでした。
501デフォルトの名無しさん:05/02/23 09:17:24
美味しいココア風味のクッキー。
でもそれは健康を害するトランス脂肪を含んでいて、
カリフォルニア州では、子供に食べさせることを全面的に禁じる訴訟が起きちゃったんですね。
以上、オレオでした。
502デフォルトの名無しさん:05/02/23 10:09:35
ためになった。感動した。
503デフォルトの名無しさん:05/02/23 19:41:44
オレオの中のクリームがまずいって事かな?
外のクッキー自体は大丈夫だよね

知るかよ
504デフォルトの名無しさん:05/02/25 14:50:00
>>476
にもあるかと思うんですが、Hibernateって、複合キーを扱えないって聞いたんですけど
本当ですか?

例えば、下のような会社、部署、従業員って3つのテーブルの関連はうまく扱えないのでせうか?
会社
PK:comp_id
部署
PK:comp_id, dept_id
従業員
PK:comp_id, dept_id, person_id

「うまく扱う」っていうのが抽象的で申し訳ないんですけど。
505デフォルトの名無しさん:05/02/25 15:34:25
Hibernate は >>504みたいな糞なテーブル設計がうまく扱えないから糞。
506デフォルトの名無しさん:05/02/25 23:16:43
> Hibernateって、複合キーを扱えないって聞いたんですけど本当ですか?

うそです。
ところで、複合キーってなんかメリットあるの?
507デフォルトの名無しさん:05/02/26 01:35:20
現実問題として、DB屋は複合プライマリキーに慣れ親しんでいる人がいっぱい
いる。
そういう現実がある以上、HibernateなりなんなりのORマッピングツールが
現実にマッチしていないとしたら問題だと思うね。こっちがいくら、PKにはPK用に
項目を設けてくれといったところで、現実にマッチしてない段階で「つかえねえ
ツールだな」と解釈されてしまう。

そういうのって勿体ないよね。HibernateもCayenneもEOFも複合キーから遠ざか
ろうとするのは良いんだが、現実問題を解決してくれ、という気持ちにもなるわな。
508デフォルトの名無しさん:05/02/26 03:50:40
既存のシステムの改修には適さないだろ
やるなら新規。
509デフォルトの名無しさん:05/02/26 07:34:26
>>507
現実問題として、DB屋に複合プライマリキーに慣れ親しんでいる人がいっぱいいても、コーディングが面倒になるからやめて欲しいのは確か。
そういう現実がある以上、DB屋が現実にマッチしていないとしたら問題だと思うね。
DB屋がいくら、PKを含んだ複合キー項目を設けてくれといったところで、現実にマッチしてない段階で「つかえねえDB屋だな」と解釈されてしまう。

そういうのって勿体ないよね。DB屋も複合キーで美しい設計にしようとするのは良いんだが、現実問題を解決してくれ、という気持ちにもなるわな。
510DB屋:05/02/26 12:20:24
>>509
あほか、大規模システムのコアは DB だ。
基幹システムのような場合、DB には Java だけでなく .net や COBOL
などからもアクセスされる。Java はただの数あるクライアントの 1 つに過ぎない。

そんな中、1 言語の中のたかが 1 ライブラリの都合なんか知るか。
思い上がりも程々にな。

あと、DB アクセスロジックを Java の中に持つなバカ。
共通化って Java の中の狭い中しか見てないだろ。
ストアドにして、どの言語からでも使えるようにしろ。

Java だけを見ていたい気持ちは分かるが。
まー、Java しか知らん香具師ほど、この気持ちは強いだろな。
511デフォルトの名無しさん:05/02/26 13:53:00
あ、三流の自称DB屋さん、ようこそ
512デフォルトの名無しさん:05/02/26 14:44:42
ストアドはよく使うけど、複合プライマリキーはやらんなあ…
ライブラリの都合の問題とかじゃなくて、そもそもそういう設計が良い設計だとは
思えんのだが…って板違いだな
513デフォルトの名無しさん:05/02/26 14:53:38
俺はどっちかというとJAVA屋だけど、510の言うことは結構同意してしまう。

509の言う「現実」ってのは「マッピングツールが対応してない」「コーディング
が面倒」ってこと? 複合キーがシステム的におかしいというならわからんでも
ないけど、コーディングの都合で設計を変えてくれってのは理解しがたい。

まぁ、複合キーの是非に関してはおいといて、システム組む時にはやっぱり
DBありきだと思うよ。
なお、個人的には複合キーは嫌いではないし、ストアドはあまり好きでない。
514デフォルトの名無しさん:05/02/26 15:00:53
>>513
複合キーのメリットってなに?
メリットにくらべてデメリットが大きいなら、設計を変えるべきだとは思う。
デメリットとしては、SQLが長くなることやら、ORマッピングに限らずプログラム上でいろんな仕組みが使いにくくなることやらあげれるんだけど。
メリットってなに?デメリットをうわまわるメリットがあるなら、考えを改める。

ところで、Hibernateで複合キーが使えないって、どういうこと?
とりあえずは使えるよね?
515デフォルトの名無しさん:05/02/26 15:03:30
>>510
それなら、いっそう、いろいろな環境から使いやすい単純なキーにしておいたほうがいいと思うが。
VBのコンポーネントでも、複合キーと相性が悪いものはあるわけだし。
Delphiのコンポーネントは複合キーだと使いにくかったし。
516デフォルトの名無しさん:05/02/26 18:03:43
複合キーがよくないのってコンポーネントの非サポートからの要請じゃない気がするんだが。
あるシステムではキーになってても連携する隣のシステムじゃその値を変更したいなんてことは良くあると思うし。

まあ、スレ違いだな。
517デフォルトの名無しさん:05/02/26 18:33:44
自然キーである複合キーを使うか、代理キーという単一のキー値を使うか。

ER図上でカーディナリティも理解できることから、自然キーがいいという意見はもっともだ。
実際、自然キーで設計されたテーブル群のほうが多いだろう。
しかしより基本的なレベルに「キー値は不変の情報を用いる」という原則がある。

最初の設計時には不変に思えた自然キーが、機能追加時に変更の必要が出てくることがある。
これは自然キーの変更を迫るような設計変更が悪いのではなく、
ビジネスの変更に応じてキーを変えられない当初の設計が間違っている。

>>510の考えには全面的に同意する。
異なる環境、言語からのアクセスも並列に存在することは当然想定すべきだし、
ストアドプロシージャというデータベースアクセスの抽象化手段も使わない手はない。
(パフォーマンス向上という副作用までついてくるんだし)

その上で、キーには代理キーを使うべきだ。
518デフォルトの名無しさん:05/02/26 21:04:47
おれストアドは結構便利に使ってるんだけど、あれ、移植性が低いんだよな...
519デフォルトの名無しさん:05/02/26 21:06:03
そんなに DB って変えるか?
520518:05/02/27 00:09:20
まあ現実にはDB変える時にはシステム全体を変える時だったりすので
対して問題になってないんだけど、次期システム開発なんかに巻き込まれて
「DBが変わります」とか言われた時に、同じDBならストアドが流用できるのに
とか考えてしまう。

まあ結局はシステムが変わってるのでストアドも作り直しになっちゃったりもする
んだけどなw
521デフォルトの名無しさん:05/02/27 01:16:00
> あと、DB アクセスロジックを Java の中に持つなバカ。
> 共通化って Java の中の狭い中しか見てないだろ。
> ストアドにして、どの言語からでも使えるようにしろ。

当面Javaでやって、もし他から必要ならWebサービスで呼び出せば充分かと。
必要かどうかもわからない共通化のために、開発環境の充分に整いにくいストアドでやる必要はなさげ。
522デフォルトの名無しさん:05/02/27 01:35:11
>>521
なるほど、Web サービスなら .net で組みやすいな。Java を使う必要もない。
で、COBOL から Web サービスの呼び出しって実績あんのか?
HTTP でパフォーマンス落としてまで Web サービスっていいか?
523デフォルトの名無しさん:05/02/27 02:20:20
>>522
えっと、必要かどうかわからない共通化にコストかけるよりはいいと思う。
524デフォルトの名無しさん:05/02/27 02:22:41
間になにか(ORマッピングスレなので、Hibernateとか)かませてやっておけば、DBの移行もストアドよりは やりやすいし。
525デフォルトの名無しさん:05/02/27 02:59:00
そう、ORマッピングの利点(の一つ)は、DBの違いをJavaプログラムから見えなくして
共通化すること。DBが他メーカーのものに変わっても、そのまま動いてくれる。

一方でストアドプロシージャは、ちゃんと作ればとにかく速い。いろんなテーブルのいろんな
ところをちょっとずつ更新、なんて処理もそつなく高速にこなしてくれる。

実際DB・APPサーバの通信がボトルネックになる事もあるから、その辺も考慮すると、
全部が全部ORマッピングというのも考えものだよな。

まあCayenneやEOFの吐き出すダサいSQLを許容してる俺がいうのもなんなのだけど...
526デフォルトの名無しさん:05/02/27 03:16:37
「全部が全部xxx」にこだわるのは、xxxに何をあてはめても考えものだな。
527504:05/02/28 09:05:24
事の発端の>>504です。
なんかレスがいっぱいあって個別にレスできないのは申し訳ないんですけど・・・
みなさんありがとう。

で、Hibernateの話ではなくなってしまってスレ違いな話題ではあるんですが、
ちょっとマジレスきぼん。

>>504
で出したテーブルは複合プライマリキーだから設計がよくないって意見が大半のような
気がするんですけど、複合プライマリキーを使わないでテーブル設計する場合って↓
みたいなのでいいんですか?

会社
PK:comp_id
部署
PK:dept_idとPKじゃない:comp_id
従業員
PK:person_idとPKじゃない:comp_id, dept_id

それとも、まったく別の形?
自分でDB設計することってほとんどないんだけど、こんな形のテーブルばっかり
扱ってきたので、普通なんだと思ってました。
識者の方、お願いします。
528504:05/02/28 09:34:22
続けて・・・
この形(複合キー)のテーブルで違和感がなかったのは

・複合キーすべてを指定してSELECTしたら、存在してれば、戻ってくるのは必ず1行
・同じ値(例えば従業員)のレコードを挿入しようとしてもDBではじいてくれる。

っていうメリットがあるような気がするんですけど。どうですか?

529デフォルトの名無しさん:05/02/28 11:01:59
>>528
> ・複合キーすべてを指定してSELECTしたら、存在してれば、戻ってくるのは必ず1行

複合キーにしなければ、1つのキーだけでも指定できる。
複合部分は主キーではないインデックスにすれば同じことが出来る

> ・同じ値(例えば従業員)のレコードを挿入しようとしてもDBではじいてくれる。

主キーにしなくてもできる

レコードを特定するのに複数の値が必要になることのデメリットの方が多いと思う。
このポリシーだと、関連するたびにキーが増えていく。
たとえば、売上に担当した従業員を保持しようと思うと、会社と部署のコードを持つ必要がある。
会社は部署からたどれるので、わざわざ従業員に持つ必要がない。
部署は従業員からたどれるので、わざわざ売上に持つ必要がない。
530デフォルトの名無しさん:05/02/28 11:54:42
>>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 はあまり使い込んでないから外してたらすまん。
532デフォルトの名無しさん:05/02/28 13:01:17
そう。
なのに、なぜかHibernateで複合キーが使えないような感じで議論が展開してる。
Hibernateじゃなくても、複合キー使うのはだいたいわずらわしい。
533デフォルトの名無しさん:05/02/28 13:02:36
それと、人がみるためのキーって、人の都合で変わるからねぇ。
534age:05/02/28 13:35:33
>>532
>Hibernateじゃなくても、複合キー使うのはだいたいわずらわしい
って、どういうこと?
535504 = 530です:05/02/28 14:09:57
すまん、スレ違いな話題を続けさせてもらって申し訳ない。

>>531
>代理キーを使う利点って、社員を外部キーに持つテーブルのカラムが
>無駄に増えなくて済むって点があると思うけど、
ですね。そのとおりだとは思っているのですが・・・>>476にもあった
>外部参照を無意味なID値でやるってことだと、
>かなりDB設計技法が変わって周囲からの抵抗が予想され.....
私もなんとなく、外部参照が代理キーになるってのが気持ち悪いというかなんていうか・・・
なので、複合キーでも特に問題があるように見えませんでした。

>Hibernate はこういう複数のカラムを
>キー用のクラスに隠蔽してくれるんじゃなかったっけ?
とりあえず、複合キー自体は扱えるようなので、
これからHibernate使って勉強してみたいと思います。

>>532
>なのに、なぜかHibernateで複合キーが使えないような感じで議論が展開してる。
いえ、>>506にだれも反論していないので複合キーは扱えるという結論なんだろうと思ってました。
で、それとは別に、そもそもなぜ、複合キーか?っていう議論に発展していて、
スレ違いとはわかりつつ、続けさせてもらってました。

で、大半の意見としては、>>532のように
・複合キー使うのは(DBのクライアント側からすると)だいたいわずらわしい。
というところなんでしょうか?

536デフォルトの名無しさん:05/02/28 14:43:21
>>534
SQL直書きなら連結のための条件が増えて面倒だし、OCXやVCLのコンポーネントなんかでも複合キーになると不便だったりする。
537デフォルトの名無しさん:05/02/28 14:47:12
>>535
逆にオレの場合、なんならOIDがキーでもかまわないくらい、実際に必要な値をキーにしたくない。
OIDだとはげしくDB依存するから、シリアル値をキーにするけど。
538デフォルトの名無しさん:05/03/02 00:26:40
539デフォルトの名無しさん:05/03/04 10:34:57
ここではすれ違いかもしれませんが、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にかじりついてるやつっていつまで経ってもツールとかでシコシコ
遊んでてぜんぜん生産性が上がってないんだよな
543デフォルトの名無しさん:05/03/05 15:25:59
>>541
使う意味あると思うよ。
クラス+hbm.xml書く手間と、クラス+XDocletタグ書く手間じゃ
大差ないし、マッピング情報をひとつのファイルに集約できる。

サンプルはmiddlegenでぐぐれば見つかるっしょ。
ただし、結構間違えたの吐くので要注意。
544デフォルトの名無しさん:05/03/05 19:50:10
Hibernateではコレクションのwhere属性を用いるより、
まとめて一つのコレクションにつっこんでから、プログラム内で仕分けをするほうが
一般的ですか?

where属性の中にHQL識別子が使えれば迷わずwhere属性を使うのですが...
545デフォルトの名無しさん:05/03/05 21:27:00
ところで、Hibernate 3.0ってインラインビュー使えるようになったの?
546デフォルトの名無しさん:05/03/07 01:51:38
>>542==>>539のニオイ(ワラ
547デフォルトの名無しさん:05/03/07 01:56:03
>>542
「Javaにかじりつく」の意味がわからないが
2chで見た憶測かな?

Javaを初めて使った頃に比べれば生産性は大幅にあがってるよ。
HibernateやCayenneは明らかに生産性を上げるものだね。
JDBCでSQL文をベタ書きするよりは明らかに
でっかい生産性を上げているね。
べた書きするとテーブル仕様変更したとき厄介だしね。
カラムを追加したときも面倒くさいし。
548539:05/03/07 08:07:09
>>546
ちがうよ
549デフォルトの名無しさん:05/03/08 11:09:48
>>542
M$信者じゃねーの?
550デフォルトの名無しさん:05/03/08 13:07:35
つまりこういうことか

いまだにWindowsにかじりついてるやつっていつまで経ってもツールとかでシコシコ
遊んでてぜんぜん生産性が上がってないんだよな
551デフォルトの名無しさん:05/03/08 14:00:43
簡単だと言われ、実際に簡単そうなサンプルを見せられると「俺にもできそうだ」
という印象を受ける。
実際には、その後それについて学ばないどころか触りもしないわけだが、その
状態で暫く時間が経過すると、何時の間にか「俺にもできそうだ」が「俺にもで
きる」に印象が化けてたりする。

.NET=簡単という立場でJavaを否定してる奴の相当数はこの手の類。
552デフォルトの名無しさん:05/03/09 02:18:25
んまー
ドトネトの考え方は
基本的に「横着」「安直」だからね。
ドトネトは合成着色料たっぷりのお菓子で子供を騙している
戦術に似ているもんね。
553デフォルトの名無しさん:05/03/09 10:34:07
まともに使えるようになってから言え。
スレタイも読めない厨房にそれは無理だろうけど。
554デフォルトの名無しさん:05/03/11 22:55:38
iBatisで文字列の前方一致、後方一致はどうやってやるんですか?
555デフォルトの名無しさん:05/03/12 09:19:45
>>554
前方一致とかのSQLを書くだけ
556デフォルトの名無しさん:05/03/12 11:41:54
>>555
レスサンクス
でも、答えになってねーよ

select * from xxx where MojiRetsu like #hoge#
といったSQLの場合、
select * from xxx where MojiRetsu like #hoge#%
って訳にはいかないよね?
プロパティ#hoge#の値として%を付加した値を渡さないとできないってことでFA?
557デフォルトの名無しさん:05/03/12 12:33:10
>>556
そだね。チュートリアルにも特に記述はないけど、次のようなソース部分があった。

<isNotNull prepend="AND" property="emailAddress">
ACC_EMAIL like #emailAddress#
</isNotNull>
558デフォルトの名無しさん:05/03/12 12:36:39
>>557

やっぱその方法か。

ありがとう。
559デフォルトの名無しさん:05/03/12 18:05:36
iBatis 知らんけど
col like #hoge# || '%'
じゃあかんのか?
560デフォルトの名無しさん:05/03/12 20:41:56
え?
できるかな?
561デフォルトの名無しさん:05/03/12 20:44:24
さてさてフフー
562デフォルトの名無しさん:05/03/12 20:50:27
ノッポさ〜ん
563デフォルトの名無しさん:05/03/12 23:47:19
んーふ んふ んーふ んんーふ
564デフォルトの名無しさん:05/03/13 00:15:44
テーケテーケテケテケテー テーケテーケ テ・テ・テー
565デフォルトの名無しさん:05/03/15 00:15:23
>>564
(゚∀゚)ラヴィ!!
566デフォルトの名無しさん:05/03/16 23:41:59
Cayenne 1.1.1が出たみたいだよ。
ttp://www.objectstyle.org/cayenne/
567デフォルトの名無しさん:2005/03/21(月) 13:04:47
Hibernateで、同一テーブルの関係テーブル(many-to-many)は
どのようにマッピングすればよいのでしょうか?

例えば、
TBL_AにID,NAMEというカラムがあって、
TBL_AのIDを2つ持った、JOIN_Aを作るにはどうすれば良いのでしょうか?
568デフォルトの名無しさん:2005/03/22(火) 21:06:10
>>567
それはmany-to-manyとは呼ばないような・・・。
many-to-one×2(JOIN_A)とone-to-many×2(TBL_A)じゃね?
569デフォルトの名無しさん:2005/03/24(木) 13:17:45
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が吐き出した
クラスを継承してメンバー追加したクラスを実行時に渡すとエラーになるんだよなぁ。
576デフォルトの名無しさん:2005/04/04(月) 21:47:35
>>574
すみませんおしえてください。
いままで何度かこのスレでも、Hibernateと複合キーの話題が出てましたが、結局
Hibernateで複合キーってのが現実的に使えるのかどうか分からずじまいだったのですが、


つまり、Hibernateでは、単一テーブルからデータを取ってくるだけなら複合キーでも
問題ないけど、リレーションを使おうとすると複合キーは使えないということなんでしょうか?
577デフォルトの名無しさん:2005/04/04(月) 22:09:54
>574
>つまり、Hibernateでは、単一テーブルからデータを取ってくるだけなら複合キーでも 
>問題ないけど、リレーションを使おうとすると複合キーは使えないということなんでしょうか? 

そう。取ってくるだけなんて現実的にありえないから、全テーブル単一キーで設計するしかない。
この時点でかなり萎える。。
反論はあるだろうが、あいにくオレはDB屋なので。。スマソ。
ORマッピー自体は賛成だが、現時点でのhibernateは使いづらいだけ。
Toque+DbUtilsの方が使いやすいし、柔軟性もあるので、オススメする。

578デフォルトの名無しさん:2005/04/04(月) 22:11:59
> 全テーブル単一キーで設計するしかない。
> この時点でかなり萎える。。

ここと

> あいにくオレはDB屋なので。

ここのつながりがよくわからんのだが、そういうもんなの?
579デフォルトの名無しさん:2005/04/04(月) 22:18:31
つーか、複合キーの方が都合いい場面があるだろ。
そういう場合でも単一キーを強制される。
たかが1ライブラリの都合でテーブル設計の選択肢が狭められるのがイヤなんだよ。
580デフォルトの名無しさん:2005/04/04(月) 23:09:26
複合キーの方が都合いい場面を知らないので、一例プリーズ
581デフォルトの名無しさん:2005/04/04(月) 23:38:17
いや、複合キーで作られたDBが先にあって、それを使ってアプリケーションを組まないといけない
ことのほうがおおい。今までもそういうことが多かった。

複合キーの善し悪しについては議論があるだろうが、なんだかんだ言っても複合キーは、
O/Rマッパーに比べて歴史の長いRDBMSではメジャーな手法で、DB屋はほぼ確実に複合キーを
使ってくる。

それを無視して「複合キーなんて旧世代の習慣だ。これからは代理キーだ」といったところで、
世の中が追いついてないんだからしょうがない。そんな世の中でHibernateが複合キーに
対応してないというだけで「DB構成変えるわけにはいかんので採用できんね」とかなってしまう
のは、実情にあわせてないツールの方に問題があると思うな。

最もこれは、Hibernateに限らず、Cayenneはもちろん、EOFですらそうなんだけど。

iBatisはSQLマッパーなんでなんとかなりそうだけど。
582デフォルトの名無しさん:2005/04/04(月) 23:51:46
まぁ、複合キー使えないのはTorqueもそうなんだが。
それよかhibernateで困るのは、生成されたPOJOにListとか勝手に追加できないこと。
583デフォルトの名無しさん:2005/04/05(火) 04:02:44
それより、>>579のいう複合キーの方が都合いい場面というのが知りたい。
584デフォルトの名無しさん:2005/04/05(火) 04:06:24
> 生成されたPOJOにListとか勝手に追加できないこと。

そうか?Middlegenの制約じゃねえの?
585デフォルトの名無しさん:2005/04/05(火) 04:07:54
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でエラーになるのよ。
これってジェネレーションギャップパターンで解決できるものなの?
587デフォルトの名無しさん:2005/04/05(火) 08:36:01
>>586
そのMyEmpはどういうマッピング定義にしてるの?
588デフォルトの名無しさん:2005/04/05(火) 09:49:52
Middlegen->hbm2java というボトムアップやってるんだが。
generation gap パターンが使えるなら知りたい。
今は、パッチのカタチで保存することでなんとかやってるけど、めんどくさい。。。
589デフォルトの名無しさん:2005/04/05(火) 10:56:50
一度生成したファイルは生成しなおさないようにすれば?
カラムの変更があったときにはhbm.xml直書き。
590588:2005/04/05(火) 14:22:59
hbm.xml は修正点少ないんで、それでもいいんですが・・・
hbm.xml にも一応、CDATAでコードかけるんですけどね。
エディットがしづらいので・・・
591デフォルトの名無しさん:2005/04/05(火) 18:19:00
hibernate3出たのにまったく盛り上がらないね。ツール待ち?
どっかに変更点まとめたサイトとかありませんか?
592デフォルトの名無しさん:2005/04/05(火) 22:06:27
Spring待ちだな。
593デフォルトの名無しさん:2005/04/05(火) 22:07:29
>>588
ドキュメントに書いてあったような気がするが。
594デフォルトの名無しさん:2005/04/07(木) 09:07:02
Hi3での大きな特徴って何?
595デフォルトの名無しさん:2005/04/07(木) 11:00:52
パッケージ名が変わった。
596デフォルトの名無しさん:2005/04/11(月) 22:10:20
>>586と同じことで悩んでいるんですが、

同じ例でいうんであれば、
session.save((Emp)myEmpObj);
ってやると、
net.sf.hibernate.MappingException: Unknown entity class
になっちゃうんですけど。

結局これってできないんですか?それともhbmでなんとかなるの?
597デフォルトの名無しさん:2005/04/11(月) 22:16:27
hbmさえ書けばどうとでもなるよ。
MyEmpのインスタンスを保存したいときはEmpだけじゃなく
ちゃんとMyEmpについても書かないといけないぞ。
598デフォルトの名無しさん:2005/04/11(月) 22:21:34
>>597
おぉ、サンクス。

>MyEmpのインスタンスを保存したいときはEmpだけじゃなく
>ちゃんとMyEmpについても書かないといけないぞ。
ってことは、
Emp = empテーブルのマッピング以外に、
MyEmp = empテーブルのマッピングを書くってことかしらん?

すまんが、どうやって書くのか例を示してもらえないだろうか?もしくは、ココみろ(URL)!でもいいので。
おながい。
599デフォルトの名無しさん:2005/04/11(月) 23:01:27
>>597
とりあえず、自分でやってみた。

MyEmpのDocletで、親クラスと同じテーブルを指定してやったら、hbmのファイルができました。
DBへのアクセスもOKでした。
/**
*@hibernate.class table="emp"
*/
public class MyEmp extends Emp {
}

で、一つだけ気になるんですけど、一つのテーブルに対して、複数のマッピングってOKなんですかね?
(この場合だと、Empと、MyEmp)
インスタンスキャッシュとかしないんでしたっけ?
600デフォルトの名無しさん:2005/04/11(月) 23:10:49
>>598
継承を使うなら、ちゃんと継承のマッピングをしないといけない。
Strategy of inheritとかそんなところで解説されてる。
継承のマッピングについては、過去レスにもある気がする。
601デフォルトの名無しさん:2005/04/13(水) 13:25:31
Hibernate使う際に、

1:DBを先に設計・実装してからそれをマッピングするJavaコードを起こす
2:Javaコードから、XDocletなどで対応するDB構造のSQLを生成しDB実装

という2つのアプローチがあると思うんだけど、
特に後者はメリットあるかな?
インピーダンスミスマッチが防げる気はするけど、DBは単なる箱になりそうな気もする。
602デフォルトの名無しさん:2005/04/13(水) 15:11:52
そのためのORマッピング。Oが先。
603デフォルトの名無しさん:2005/04/13(水) 15:30:28
Oを意識して、R優先。
604デフォルトの名無しさん:2005/04/13(水) 16:41:13
ROマッピングってゆえ、っていう主張もあるね。
605デフォルトの名無しさん:2005/04/13(水) 22:58:32
なんだかんだでシステム開発の要はデータベースだったりするので、
Rが先にあって、でもOではこういう構成になってた方が使いやすい
というのがその次にきて、リレーション関係で解決できる部分は
ORマッピングで対応して、リレーションだけではどうにもならない、
複数のエンティティが絡み合っているようなものはドメインモデルで
解決、という感じかな。
606デフォルトの名無しさん:2005/04/14(木) 02:53:43
ORマッピングが出てきたときには、オブジェクトデータベースみたいなことをRDBでやりたいなぁって感じだったんだろうね。
オブジェクトをそのままRDBに突っ込めますよと。
実際には、RDBの制約やら設計のやりやすさの方が強かった。
607デフォルトの名無しさん:2005/04/18(月) 11:07:58
Hibernateとかって、複数のデータベースに対応してるの?
というか、複数データベースに対応してるORマッピングってあるのかな?
608デフォルトの名無しさん:2005/04/18(月) 13:05:42
EOFかな。商用だけど。
609デフォルトの名無しさん:2005/04/18(月) 20:53:07
Cayenneもサポートしてるよ。
まあ構造がEOFと一緒だし。
610デフォルトの名無しさん:2005/04/28(木) 16:54:22
JDK5で generics が導入されて、バグ防止のためにも出来るだけ使いたいんですが、
Criteria.list() で取った List を DeapCopy せずに上手いこと typesafe な
別変数に入れたり戻り値として返す方法ないでしょうか?
キャストしただけだと警告出ますし。
具体的には、↓みたいな。

Criteria criteria = session.createCriteria(Hoge.class) ;
List<Hoge> hogeList = criteria.list() ; // ここで警告が出ます
return hogeList ; // List<Hoge>を返したい

なんか、OR固有の話題ではないような気もしますが。。。
611610:2005/04/28(木) 16:55:40
あ、すいません。使ってるのは Hibernate3 です。
612デフォルトの名無しさん:2005/04/28(木) 21:56:19
>>610
キャストできんの?
613デフォルトの名無しさん:2005/04/29(金) 01:39:04
hibernateのライブラリがgenericsで書かれていないかぎり警告が出るのはしょうがない。

>>612
キャストはできるだろうがコンパイル時にチェックできないよという旨の警告が出るはず。
614デフォルトの名無しさん:2005/04/30(土) 12:57:19
質問です。
参照系はHQLではなく、SQLに近い形で作ることが
createSQLQuery("SQL文");できます。
更新系(update,delete,insert)はSQLできますか?
用途は、たとえば、1万件のデータを一括して変更・削除する場合などです。
よろしくお願いします。
615デフォルトの名無しさん:2005/04/30(土) 16:46:46
hibernate使う意味あんのか?
616デフォルトの名無しさん:2005/04/30(土) 18:36:39
ほかをHibernateでやってたらHQLでやりたくなるんじゃねぇ?
617デフォルトの名無しさん:2005/05/03(火) 23:30:40
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経由で行う。
619614:2005/05/06(金) 11:10:12
>615 >616 >618

ありがとうございます。

hibernateからconnectionを取得してみます。
これから調べて試行錯誤します。

620デフォルトの名無しさん:2005/05/09(月) 16:26:22
HibernateでJDBCコネクション使う場合は、

* Hibernateの外から与えるJDBCコネクションを使う.
* HibernateがDriverManagerから取得したJDBCコネクションを使う.
* HibernateがJNDI経由のDataSourceから取得したJDBCコネクションを使う.

の3つらしい。
詳しくは、このへん。
ttp://www.hibernate.org/hib_docs/reference/ja/html/session-configuration.html#configuration-userjdbc
621デフォルトの名無しさん:2005/05/09(月) 23:27:52
>>619
net.sf.hibernate.Session#connection()で取得できると思うが。
勘違いしてたらスマソ。
622619:2005/05/12(木) 15:25:23
>620 >621
アドバイスありがとうございます。
残念ながら取得することができませんでした。
実際のプログラムとしては、
Connection connection = <hibernateのconnection取得メソッド?>
Statement statement = connection.createStatement();
というような流れになるでしょうか?
621様の net.sf.hibernate.Session#connection()
が利用できませんでした。(#の意味を推測してみましたが、理解できず申し訳ありません。)
よろしくお願いいたします。
623デフォルトの名無しさん:2005/05/12(木) 15:32:19
>#の意味を推測してみましたが、理解できず申し訳ありません。

チョットワラタ
624デフォルトの名無しさん:2005/05/12(木) 16:01:47
>>622
なんかほのぼのしていいな。

# は「の」もしくは「クラスの」と訳して読み替えてみるべし。
625619 622:2005/05/12(木) 17:49:07
>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も参考にしましたが同様にうまくいきません。
皆様のお力をおかしください。
626デフォルトの名無しさん:2005/05/12(木) 18:01:10
>>625
基本的なところはググるか、ドキュメント読むことをお勧めします
ttp://www.hibernate.org/hib_docs/reference/ja/html/
ttp://www.atmarkit.co.jp/fjava/rensai3/ormap05/ormap05_1.html
627デフォルトの名無しさん:2005/05/12(木) 18:07:32
.>>625
ついでだから

とりあえず(1)はこれで

// セッションファクトリーの作成
SessionFactory sessionfactory = config.buildSessionFactory();
// セッションオープン
Session session = sessionfactory.openSession();

次に(2)
上で取得したsessionインスタンス使って
session.connection();


628デフォルトの名無しさん:2005/05/12(木) 23:20:05
>>625
Hibernateより前にしっかりJava自体を勉強したら?
それからでも遅くないと思うよ。
629デフォルトの名無しさん:2005/05/13(金) 09:18:51
ところで、スレタイとはかけ離れてるんだけど、
CSVファイルをJDBCのインタフェースで読み書きできるLibがあった。ガイシュツ?

「CsvJdbc」
http://octopus.objectweb.org/doc/2.8/extras/Csvjdbc_readme.html

SourceForgeも同じプロジェクトがあったけど、最新版はObjectWebの
Octpusプロジェクトに内包されてる。
http://forge.objectweb.org/project/showfiles.php?group_id=39
ここの「octopus-3.3-1.zip」に、jarが入ってる。

けっこー便利かも。
とりあえずできることは、SELECT/INSERT/UPDATEあたりと限られてるけど。
630625:2005/05/13(金) 15:27:22
みなさまありがとうございました。大変たすかりました。
自分のjavaの知識の浅さを認識しました。
基礎をしっかり学んでみます。
631デフォルトの名無しさん:2005/05/13(金) 15:31:07
なんだか心が洗われるスレだなあ。
632デフォルトの名無しさん:2005/05/13(金) 19:48:45
>>629
面白いな。
使わないと思うけど、いいかも。
633デフォルトの名無しさん:2005/05/17(火) 11:11:24
1つのクラスにJDBCでSQL直書き、現状5000行まで来ました。
このクラスを見るたびに吐き気がします。
型を変えたり、列を追加したりするたびにエラーの雨嵐。
列を削除したらりざるとせっとの値がずれてエラーノアメフラシ
Hibernate使えば少しはマシになりますか?
634デフォルトの名無しさん:2005/05/17(火) 11:25:15
>>633
その前に、テストクラスを作れ
クラスを分割した方がいいのかも。
635デフォルトの名無しさん:2005/05/17(火) 11:26:02
>一個のクラスに5000行
>列を変えたり
>削除しただけで値がずれる

どれもORまっぱー以前の話じゃん。
そこら辺なんとかしなければ使っても変わらない。
636デフォルトの名無しさん:2005/05/17(火) 11:49:06
>型を変えたり、列を追加したりするたびにエラーの雨嵐

とゆー事態は多少はましになるかも知れんが
導入したら導入したで別の問題(パフォーマンスだとか)が発生してグダグダになるのが目に見える
637デフォルトの名無しさん:2005/05/17(火) 12:01:08
皆さんありがとうございます。
どのように分ければ多少マシになるのか教えていただけませんか?
今は検索も追加も更新もDBにアクセスするものは全てそのクラスに入ってます。
638デフォルトの名無しさん:2005/05/17(火) 12:14:53
とりあえず用途別に分けたら?
どうせstaticメソッドばっかりだろ?
インスタンスメソッドだったとしても、せいぜいインスタンスフィールドはコネクションだけ、みたいな。
639デフォルトの名無しさん:2005/05/17(火) 12:16:16
ORマッピングはマッピングであってラッピングではないから、きたないプログラムはきたないままだよ。
640デフォルトの名無しさん:2005/05/17(火) 12:33:14
O/R マッピングの前に DB の正規化とかソフトウェア設計とか、先に学ぶべき
ことが多いように思う。

分かってる人間が楽するツールであって、基礎がなってない人間が使っても
意味がないよ。
641デフォルトの名無しさん:2005/05/17(火) 12:57:43
皆さんどうもありがとう!
そうですよね。今はプログラムやDBの質をあげることに精進します。
ガンバルゾー!
642デフォルトの名無しさん:2005/05/17(火) 15:00:46
・・・その後、>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歳になる姪っ子に見せたら泣いてしまうくらいで、ホントに困っています。
なんかコーディングのヒントだけでも教えていただけませんか・・・
644デフォルトの名無しさん:2005/05/17(火) 16:46:51
その肥大化した一つのクラスは何テーブル相手にしてるの?
1テーブルしか対象にしてなくて5KL?
645デフォルトの名無しさん:2005/05/17(火) 16:51:28
>644さん
マスタマップも含めて20テーブルくらいです。
646デフォルトの名無しさん:2005/05/17(火) 16:51:39
SELECTの結果をシンプルにBeanに詰め直すだけなら、
CommonsのDBUtilsとか使うと少しは綺麗になるかな。
ただ、INSERTとかでBeanからの取り出しは出来なかったはず。

DBの設計に問題が無いんであれば、とりあえず
SELECT・INSERT・UPDATE単位なり、Table単位なり、
作業目的単位なりでクラスを分けてみては。
無駄なところ、共通する部分が見えてくるかもしれんので。
647デフォルトの名無しさん:2005/05/17(火) 16:52:46
>>645
まずはテーブル毎にクラスをわけろ
一つのクラスに入れとく意味がない
648デフォルトの名無しさん:2005/05/17(火) 17:10:52
ほとんどORMの話題ではなくなってきてるが・・・つかJavaの話題ですらないな

あえてJavaの話題にするなら、テーブルカラム名とbeanのプロパティ名が完全一致なら
プロパティリストをとって何も考えずループとか。
完全一致じゃなくてもアノテーション使えばいいか。

もっとも>>633はそれ以前の話題と思われ。

どっかに一つのアプリが一つのクラスに入ったソフトみたいなブログを見た記憶があるが、それに近いな
649デフォルトの名無しさん:2005/05/17(火) 17:28:29
皆さんどうもありがとうございます!
今から用途別やテーブル毎で分けてみます。
スレッド違いなのにいろいろ教えてくださってありがとうございました。
2chでこんなにやさしくしてもらえたのは初めてです。
生まれ変わったら俺もみなさんのような教える側の人間になれるようにがんばります。
650デフォルトの名無しさん:2005/05/17(火) 17:35:07
いや、生まれ変わる前に教えられるようになりなよw

ある程度機能や目的別にクラスが整理できて、やってること同じでつまんねと思ったら
ORMに進めばいいことがあるかもよ。ガンガレ
651デフォルトの名無しさん:2005/05/17(火) 17:43:51
デザインパターン勉強しる
652デフォルトの名無しさん:2005/05/19(木) 10:37:15
Hibernateの質問〜
HQLを動的組み立てるのはどうやればいいでしょうか?
普通に文字列結合して後でパラメータ設定するとソースがかなり汚くなる手間もかかる。
あとgetNamedQueryで取ってきたものに検索条件を追加できないでしょうか?
653デフォルトの名無しさん:2005/05/19(木) 11:39:03
俺も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のコレクションが帰ってくるようにするにはどうしたらよいの?
おせーてください。
654デフォルトの名無しさん:2005/05/19(木) 23:10:40
inner join fetch

そもそも2で帰ってくるのは (UserとGroupの配列) のリスト なのはわかってるのか?
655デフォルトの名無しさん:2005/05/20(金) 11:48:15
>>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;
}
656デフォルトの名無しさん:2005/05/21(土) 00:54:18
hibernateの設定ファイルでuse_outer_joinをtrueにしたり
max_fetch_sizeを適当に大きくしたりする。
あるいはmany-to-oneとかの属性でouter_joinをtrueにする。
657デフォルトの名無しさん:2005/05/22(日) 18:46:06
select * from cats
みたいな感じで、{}で別名の定義をしていないSQLは、Hibernate2.x系でも3.x系でも、
createSQLQueryで使うことはできない。

…あってる??
658デフォルトの名無しさん:2005/05/22(日) 20:10:20
やってみれば?
659デフォルトの名無しさん:2005/05/22(日) 20:33:11
いや、エラーがでることは確認したんだけど、回避する方法あるのかなと思って。
660デフォルトの名無しさん:2005/05/22(日) 21:27:08
>657
できない。
661デフォルトの名無しさん:2005/05/22(日) 21:49:29
>>660
thx!!
662デフォルトの名無しさん:2005/05/22(日) 21:52:21
>>661
ああ?!なめんなよ!
663デフォルトの名無しさん:2005/05/23(月) 10:15:01
Hibernate3.0では、生SQL実行が充実されてるって聞いたけど、
具体的にはどんな感じなの?
664デフォルトの名無しさん:2005/05/23(月) 10:28:16
665デフォルトの名無しさん:2005/05/23(月) 19:09:33
>>662
そんな不良みたいな口の利き方おやめなさい
666デフォルトの名無しさん:2005/05/24(火) 00:01:00
>>665
っるせぇっつってんだよ、このババァ
667デフォルトの名無しさん:2005/05/24(火) 00:17:52
なんか過去に戻って歴史を変えてしまった瞬間に
立ち会ったような気分だ
668デフォルトの名無しさん:2005/05/24(火) 00:28:18
いみふめ。
おまえ、心が不健康だな
669デフォルトの名無しさん:2005/05/24(火) 01:38:49
>>668
すまんな、665がネタをふってくれたもんでな。
670デフォルトの名無しさん:2005/05/24(火) 01:41:29
あーそうか。
ガンヲタが不健康ってことね。
そりゃ反論出来ません。
671デフォルトの名無しさん:2005/05/24(火) 09:04:16
>>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に
設定したく・・・
674デフォルトの名無しさん:2005/05/28(土) 21:42:06
死んだか...
675デフォルトの名無しさん:2005/05/30(月) 17:48:34
>>372
折れも知りたいage
676デフォルトの名無しさん:2005/06/01(水) 23:01:48
正規化と多様性
保守とパフォーマンス
677デフォルトの名無しさん:2005/06/04(土) 12:26:18
Torqueって使ってる人いる?
禿げしく役に立たない気がするんだが。
仕事なんで仕方なく使ってるけど。
678デフォルトの名無しさん:2005/06/04(土) 15:39:52
かわいそうに・・・
679デフォルトの名無しさん:2005/06/05(日) 04:37:06
一時期けっこう話題になったが開発止まってるからな・・・。
止まってる理由が理由だけにしょうがないけど。
680デフォルトの名無しさん:2005/06/05(日) 11:39:18
理由って何?
681デフォルトの名無しさん:2005/06/05(日) 12:48:38
開発者が亡くなったらしい
682デフォルトの名無しさん:2005/06/05(日) 13:20:08
つーか、そもそも存在意義がわからん。>Torque
ObjectとRDBのギャップを減らすんじゃねーのかよ。
SQLは隠すけどテーブル隠さないなら
頭隠してチンコ丸出しじゃねーか。
683デフォルトの名無しさん:2005/06/05(日) 13:53:35
ORマッピングツールである以上、テーブルの情報は
欠かせないよ。

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

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

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

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

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

ていうかクレイグがEJB3.0のスペックリードだっけ?
689デフォルトの名無しさん:2005/06/05(日) 20:34:16
Hibernateのアノテーションは、EJB3と共通だよ。
クレイグはStrutsの人で、JSFのスペックリード。
690デフォルトの名無しさん:2005/06/05(日) 20:36:21
オリはよう
ひきこもりサンデーPGだからよう
自前のXML->SQL,JavaBeanジェネレータとか作って遊んでただ
でもよう、ひきこもってたら米がなくなってよう
こんなオリにおすすめのO/Rマップを教えてくれよう
691デフォルトの名無しさん:2005/06/05(日) 21:02:01
>>689
ごめん、クレイグはWebの人だったね。
Hibernateはグラビンだったかな。
692デフォルトの名無しさん:2005/06/05(日) 21:03:19
>>690
EJB3サイコー
693デフォルトの名無しさん:2005/06/05(日) 22:20:37
>>234
お仕事がんばれ。
694デフォルトの名無しさん:2005/06/05(日) 23:59:36
>>681
そう言われてみればそうだな・・・。
ttp://www.apache.org/foundation/martin.html
695デフォルトの名無しさん:2005/06/07(火) 19:03:11
Hibernate3で、Native-SQL投げるときに(iBATISみたいに使いたいと)、
複数テーブル間のJOINした結果を受け取るのって、
どんな形式になるんかな?
この辺ながめてみたけど、JOINは想定してない記事?
http://blog.hibernate.org/cgi-bin/blosxom.cgi/2004/08/23#customsql
http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#querysql
http://www.theserverside.com/blogs/showblog.tss?id=Hibernate3_JDBC

696デフォルトの名無しさん:2005/06/10(金) 20:14:33
うわぁ、>>695のリンク先見たけどiBATISクリソツ・・・
現在メモリ節約の関係でiBATIS使いなんだけど、
Hibernate3に乗り換えようかと悩んでしまうよ。

横レス失礼
697デフォルトの名無しさん:2005/06/11(土) 01:06:18
>>695
SQLQueryだったら
 SQLQuery q = sess.createSQLQuery(
  "select {s.*}, {t.*}, {u.*} from t_sss as s join t_ttt as t join t_uuu as u");
 q.addEntity("s", Sss.class);
 q.addEntity("t", Ttt.class);
 q.addEntity("u", Uuu.class);
とするとq.list()としたときにList<Object[]>が得られる。はず・・・。
[0]がt_sssのマッピングで[1]がt_tttのマッピングで、とか。
698695: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デフォルトの名無しさん:2005/06/20(月) 15:51:47
するんですよ。
701デフォルトの名無しさん:2005/06/20(月) 16:07:06
>>700
うう、すみません。
ところで、あってるということでしょうか?
とりあえず質問していきたいと思います。

私の気になっているところはどの時点で関連をばらしてしまうのか?ということです。
DAOクラスを作る場合
各テーブルごとのDAOクラスを作成していますが
そのばあい、注文のDAOは
calss ChumonDao{
  public void insert(Chumon chumon);

}

注文詳細のDAOは
calss SyousaiDao{
  public void insert(Syousai syousai);

}

のように作成しています。

DAOに委譲した時点で既にテーブル間の関連はなくなっているので
DAOを呼び出すビジネスロジックで関連をばらしてあげる
という感じにしました。

このやり方って間違ってますか?
702デフォルトの名無しさん:2005/06/20(月) 16:17:05
ビジネスロジックのソースはこんな感じです

public void insert(Chumon chumon){

    newChumon = chumonDao.insert(chumon);
    Integer id = newChumon.getChumonId();
    List syousaiList = chumon.getSyousai();

    for(Iterator it=syousaiList.iterator();it.hasNext();){
        Syousai syousai =(Syousai)it.next();
        syousai.setChumonId(id);
        syousaiDao.insert(syousai);
    }

}
703デフォルトの名無しさん:2005/06/20(月) 20:11:31
>>701
O/Rマッピングにも色々あるが関連を作れるものが殆どだと思う。

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

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

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

AOPの宣言的トランザクション等を利用するなら
君のソースは使えます。
705デフォルトの名無しさん:2005/06/28(火) 19:09:22
Hibernateのmany-to-oneマッピングについてちょっと質問
例:
TableA:
id
creator_user_id 
updater_user_id
Usertable
id
name
↑のようなテーブルがあって、TableAのcreator_user_idとupdater_user_id両方に
Usertableとのmany-to-one関係を指定したら、Hibernateの起動時に
net.sf.hibernate.MappingException: Repeated column in mapping for class sample.tablea should be mapped with insert="false" update="false" : id
↑のようなエラーが出て初期化に失敗します。
メッセージの通りinsertとupdateをfalseに指定したら動くようになったが、
(例の構成ではそうでもないが)更新ができないようではやはり少々不便なので、
何か解決法はないのでしょうか?
706デフォルトの名無しさん:2005/06/28(火) 19:21:29
>>705
設定の失敗をHibernateのせいにしないこと。
おかしいだろ。
> Repeated column
707デフォルトの名無しさん:2005/06/28(火) 19:31:40
はやっw
見直したら確かにcolumnを勘違いして、対象テーブルのカラムを入れのが原因だった。
ありがとう&吊って来る。
708デフォルトの名無しさん:2005/06/29(水) 10:23:52
何を何で吊るというのか?
709デフォルトの名無しさん:2005/06/29(水) 11:21:10
回線でお前の首を。
710デフォルトの名無しさん:2005/06/30(木) 22:52:54
Hibernateを使用したWebアプリをスタンドアロンのPCで
Tomcat上で動作させるとMappingExceptionがでるんですが、
解決方法ありませんか?
711デフォルトの名無しさん:2005/06/30(木) 23:38:24
>>710
バージョンは?
712デフォルトの名無しさん:2005/07/07(木) 15:35:05
トランザクションとコネクションプーリングについて少々質問。

//前処理(referenceの一部コピペ)
tx = session.beginTransaction();
BlogItem item = (BlogItem) session.load(BlogItem.class, itemid);
item.setText(text);
tx.commit();
session.close();
これでやってくれれば問題はないだが、

BlogItem item = (BlogItem) session.load(BlogItem.class, itemid);
item.setText(text);
session.flush();
session.close();
とflushだけされると、
そのコネクションにコミットされてないデータが残り、
hibernate内蔵のコネクションプーリングを使っているとそのコネクションを引き継いだ
リクエストだけほかのと違う値が帰ってくるという問題があった。
DBCPを使うととりあえずは直ったが、少々疑問が。
1、これはhibernate内蔵のコネクションプーリングのバグ?
2、hibernate的にcloseで放棄されたjdbcコネクションはプールに戻るが、
 rollbackは誰が実行したのですか?
3、2でもしDBCPがやってるとしたら、これは自前で例えばcloseする前に
rollbackしたほうがいいですか?(コネクションの種類が変わると動作も変わるってのもあれなので)
713デフォルトの名無しさん:2005/07/07(木) 15:40:56
すいません、↑だがテストのミスでした。
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"が帰ってくる

ご存知の方、教えてくださいまし・・・
715デフォルトの名無しさん:2005/07/12(火) 16:33:23
>>714
>SpringとHibernateをTomcatで、組み合わせて使っているんですが、 
問題の切り分けは出来ているのか?

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

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

3.セッションのスコープ範囲のミス
 ・セッションのスコープがapplicationスコープになっている等。
716714: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さんで違うので。

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

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

>>718
明示的にしている部分はないんだけど、auto_flashなモードとかってあります?
722デフォルトの名無しさん:2005/07/13(水) 13:47:01
デフォルトでcloseするときにSQL発行するんでなかろーか
flush()なんてメソッド使ったことないし
723デフォルトの名無しさん:2005/07/13(水) 15:48:44
>>714
キャッシュされた同じオブジェクトが帰ってきてるだけかと。
724デフォルトの名無しさん:2005/07/13(水) 15:53:02
Hibernateは取得したオブジェクト変更したら
勝手に最後にupdateしちゃうぞ
725デフォルトの名無しさん:2005/07/13(水) 16:06:28
ま、理由はどうあれ、>>714はただしい動作だな。
そこで値が異なることを期待するほうがおかしいと思う。
726714:2005/07/13(水) 16:39:37
みなさんレスありがとさんです。

やっぱり最後にUpdateされるのは仕様ですか、そうですか。
あれ?ってことは、わざわざ save()とか呼ばなくてもいいってことですか?

昔、EntityBeanを使ってWebのアプリケーションを組んだときには、
EB直接編集すると、それこそトランザクションコミットした際にアップデートされてしまうので、
編集する際には、EBから、Value Object(今はDTO?)を取り出して、
編集はそのDTOに対して行って、最後にそのDTOをEBに戻して、
DBアップデートみたいなことをしてたんですけど。

Hibernateも同じ考えなんですかね?cloneして使うとか、かな?

こんな場合みなさんどうしてるんですか?できれば教えてほしいっす。
727デフォルトの名無しさん:2005/07/13(水) 16:43:12
>724
flushしない限りは発行しないよ。
728デフォルトの名無しさん:2005/07/14(木) 00:05:22
>>726
> あれ?ってことは、わざわざ save()とか呼ばなくてもいいってことですか?
save()はSQLのINSERT相当です.
更新はHibernateセッションのflush()時に勝手にやってくれます.

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

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

あー、すっきり。ありがとうございました。助かりました。
731デフォルトの名無しさん:2005/07/15(金) 13:29:38
> 一時は真剣に、DAOから取り出すEntityは、
> すべてcloneしてやろうかと思ってぞっとしてました。

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

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

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

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

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

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

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

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

SQLiteは242KBのDLLだから配布しやすいんですよね・・・
JNI経由でOS毎にDLL作ったほうがよいのでしょうか。
マナー違反?
743デフォルトの名無しさん:2005/07/18(月) 01:04:17
>>742
待て待て、3MBって何のサイズだ?
それ、ドキュメントやソース込みのzipファイルのサイズじゃないか?
HSQLDB1.8.0.1のhsqldb.jarは611kBだ。

それと、これ以上語りたいならこっちのスレが適切かと。
【Pure】HSQL database engine【Java】
ttp://pc8.2ch.net/test/read.cgi/db/1060970234/
744デフォルトの名無しさん:2005/07/18(月) 13:58:25
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です。
746デフォルトの名無しさん:2005/07/19(火) 11:57:03
書いてある通りだと思うんだが
747デフォルトの名無しさん:2005/07/19(火) 14:22:00
>>746さん、どうやって解消したらよいかご存知でしたら教えてもらえませんでしょうか?
よろしくお願いします。
748デフォルトの名無しさん:2005/07/19(火) 21:01:14
答えようかと思ったのだが、おれは746ではないし。
749デフォルトの名無しさん:2005/07/19(火) 22:34:34
>>748はハゲ
750デフォルトの名無しさん:2005/07/19(火) 22:54:00
>>744
もうJNIで実装はされているのね。
あんがと。ネイティブで頑張る。Win/Linux以外はユーザに作らせる。
751デフォルトの名無しさん:2005/07/20(水) 00:40:10
>>748さん、>>746さんそれ以外の方々もご存知でしたら何卒ご教授願いますようよろしくお願いいたします。
752デフォルトの名無しさん:2005/07/20(水) 04:24:41
>>751
update()に渡すオブジェクトと同じレコードにマッピングされたオブジェクトが
すでにセッションにあると例外が飛んできます
つまりupdate()するオブジェクトをfind()とかしちゃダメ
http://d.hatena.ne.jp/koichik/20040812#1092329105
753デフォルトの名無しさん:2005/07/20(水) 09:47:56
ふつうにfindしたオブジェクトを変更してupdateしてるけど・・・

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

>>733な意見なのはよくわかるんだけど、どうやってるの?
設計段階、もしくはコーディングのルールとして開発者が「意識して」オブジェクトの内容を
変更しないように気をつけているの?
それともなにか別の仕組みとして、開発者が意識しなくても制御できるようになっているの?
誰かおせーて。
756デフォルトの名無しさん:2005/07/20(水) 18:14:39
必要なモノ取り出したらSession閉じればいいじゃない
757デフォルトの名無しさん:2005/07/20(水) 21:38:27
>>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みたいなことできるか?
760759:2005/07/30(土) 14:12:07
とりあえず試してみたよ。マーシャル・アンマーシャルにdom4jを使っているんだな。パフォーマンスで分が悪そうな感じがする。
マッピングファイルを使ってある程度自由なXMLを書き出すことができるのはCasterと一緒か。
761デフォルトの名無しさん:2005/08/09(火) 17:07:54
外部キーについて
many-to-one関連で主キーを使ってマッピングした場合は外部制約を正しく生成してくれるが、
property-refを使ったmany-to-one関連はまったく生成してくれなくて困っています。(hbm2dllで)

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

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

まぁ、WEBアプリなんかではありがちな手法だと思うが。便利かどうかはシステムの仕様次第じゃないか。
ちなみに間違ってても責任とれんので実験してみてくれ。
766デフォルトの名無しさん:2005/08/19(金) 08:04:45
サンクスコ.
オレ的には別に他ユーザーがupdateしちゃったとしてもそのまま上書きしてもいい感じがするんだがなぁ(初心者的発想w
なんでそんな七面倒なカラクリが必要なんだろうな。
767デフォルトの名無しさん:2005/08/19(金) 11:01:38
ある銀行口座にAとBが同時に一万円振り込んだ場合、
変にupdateしちゃうと二万円増えるはずが
一万円しか増えないかもしれなくて問題だろ?
768デフォルトの名無しさん:2005/08/19(金) 11:03:46
>767
それはアップデートする直前にselect for updateすれば解決だから例えとしては微妙ですな。
769766:2005/08/19(金) 13:49:53
>>767
口座テーブルにAとBが同時に1万振り込むって、insert into するので、rowが衝突することが無い希ガス。
誰か漏れを上手に納得させてクリクリ.
770766:2005/08/19(金) 13:55:57
ここみて、とりあえずの理解はした。
http://e-words.jp/w/E383ADE38383E382AF.html
が、なんか釈然としない。
これはデータベース側の話であってHibernateが持つversionとかtimestampなどのカラクリとでは違う希ガス。
どうもウマく説明できないな(;´д`)
771デフォルトの名無しさん:2005/08/19(金) 14:00:02
>>766
だから仕様次第。
長めのテキストの誤植を直すような時には上書きしちゃ困るし。
772デフォルトの名無しさん:2005/08/19(金) 14:14:08
>766
俺が編集画面を開いて、編集している間に他の人がデータを変更したら困る場合に使う。
例えば・・・そうだな、会議室の予約とか。
先にとった人が居たのに上書きされじゃ困るよな?(まあこれも他の方法で避けられるが
773デフォルトの名無しさん:2005/08/19(金) 14:14:26
見てるものと更新する先が違うとやだなぁ、って場合はある
Wikiとかそーなってるよな
774766:2005/08/19(金) 14:21:12
>>771-773
週末の昼間からどうもありがd。だんだん理解してきた。
やり方にもよるかもしれないが、更新直前にselectで同じrowを拾ってきてversionみて、編集中のものと比較して
違っていたら例外、っていう感じになるのかな?
775デフォルトの名無しさん:2005/08/19(金) 14:54:46
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>
779デフォルトの名無しさん:2005/08/29(月) 00:09:49
Hibernate Annotationsでいいような気がするけどなぁ。
EJB3に準拠してたほうががなにかと便利だし。
780デフォルトの名無しさん:2005/08/29(月) 01:47:37
>>778
価値がわからん。
>>779の言う通り、オフィシャルのHibernate Annotationsでいいと思う。
781デフォルトの名無しさん:2005/08/29(月) 02:52:23
次期バージョンEJBならば、価値が見えてくるのかな?

今までXDocletでしかできなかったことが言語使用レベルで
できたことで、エラー警告情報などがJava側で確認でき
一括管理できたというメリットがあるのかな?

XDocletとルールも全然違うことに驚かされる。

それよりも、Genericsが使えるようになったのは大きいかと。
推測だが、以前よりもエラーチェックが厳しくなって堅牢性が高くなったことが大きな価値のひとつにみえる。

782デフォルトの名無しさん:2005/08/29(月) 03:46:35
>>781
(゚Д゚)ハ?
783デフォルトの名無しさん:2005/08/29(月) 04:37:59
>>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で工夫するしかないんじゃない?
786デフォルトの名無しさん:2005/09/03(土) 12:58:47
>>784
QueryWithRowHandler
787デフォルトの名無しさん:2005/09/06(火) 22:08:51
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 とかいろいろあって
どこから手を付けていけばいいのか分かっていません。
788デフォルトの名無しさん:2005/09/06(火) 22:59:35
>>787
試したことないけど、とりあえず id generator は foreign を指定してんだよね。
789デフォルトの名無しさん:2005/09/07(水) 17:30:48
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の動作が変わることなどはあるのでしょうか?
何か似たような症状が現れたことがある方はいませんか?
791名無しさん@そうだ選挙に行こう:2005/09/10(土) 19:00:11
>>790
iBATISはぜんぜん知らないのだが、
発行しているSQL文はログで見れないの?
792デフォルトの名無しさん:2005/09/12(月) 10:12:01
>>790
漏れはoc4j、Tomcat、OraDB、iBATIS、spring、JSFだけど
そんな症状見たことない。

つーか、トランザクション環境さえも晒さないで、答えを
得られるとでも思ってるの?

とりあえず>>791が書いてるようにログ見ろ。
ログレベルをdebugにするよろし。
793デフォルトの名無しさん:2005/09/13(火) 00:02:50
>>790
ログ見て一緒ならトランザクション隔離レベルかな?
oc4jのデフォルトってSerializableだったりすんの?
794デフォルトの名無しさん:2005/09/13(火) 01:02:41
でも、iBatisって中で相当無理なことしてる印象があるから、
多少問題が起こるのは予定調和ジャマイカ
795デフォルトの名無しさん:2005/09/13(火) 22:35:39
少し質問
今hibernateを勉強してて、ちょっと思ったんけど
例えば
あるテーブルAとテーブルBが1:Nというmappingはできたんだけど
テーブルAとテーブルBが1:NでテーブルAとテーブルCが1:Nの場合に
テーブルAのmappingでone-to-manyの書き方が、いまいち分かりにくいんですが
この場合は、どう書けばいいのでしょうか?それともHQLかSQLを書くしかないのかな?
796デフォルトの名無しさん:2005/09/13(火) 23:56:27
>>795
>あるテーブルAとテーブルBが1:Nというmappingはできたんだけど
をテーブルCの分も書けばいいでない?
hbmをさらしたほうがはやいかも。
797デフォルトの名無しさん:2005/09/14(水) 21:09:37
hibernate-tools の変わりようが激しくて泣きそう。。
798795: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
801デフォルトの名無しさん:2005/09/15(木) 00:24:57
>>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
;
805デフォルトの名無しさん:2005/09/15(木) 03:26:51
>>802
>その更新処理においてRLM_INFOのhbmを読み込む段で例外(MappingException)が出ます。
>primary key がない場合はhbmを手書きでゴリゴリ修正しなければならないのでしょうか?
<composite-id> を使えば ok。
でも一意なキーを作ったほうがらくかもね。
806デフォルトの名無しさん:2005/09/15(木) 04:48:05
NULLにするのとニートな役職用意するのと
どっちが設計的に優れてるんかな?
俺は後者の方が吉だと感じるんだが。
もっともORMとは直接関係ない話だが。
807デフォルトの名無しさん:2005/09/15(木) 07:45:36
>>805

<composite-id>
</composite-id>

こんなふうに空でできています。
ここに何か入った状態で自動生成させるには、
前工程(middlegenの設定?)のどこかで何かやるのか、
これから会社いって確認してきます。ありがとうございました。


>>806
確かに設計的にはそうかも。
でもこれで巻き取り対象の旧システムは
(+)使いまくりのニートな設計なのでしたorz
808デフォルトの名無しさん:2005/09/15(木) 09:34:39
>797
?プラグインの中のjarを取り出せば、2.xの時と同じように使えるが
809デフォルトの名無しさん:2005/09/15(木) 16:03:48
>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関係の人か?

813デフォルトの名無しさん:2005/09/20(火) 01:40:38
浅香唯 C-Girl
814デフォルトの名無しさん:2005/09/22(木) 01:49:22
>>812
たんなるじじいだろ。
815デフォルトの名無しさん:2005/09/22(木) 07:27:34
大学生だけど普通に使うよ。
816デフォルトの名無しさん:2005/09/24(土) 14:20:15
質問があります。
外部キーや参照整合制約が一切作られていない、DBがありまして、
そこからMiddlegenで、マッピングを自動生成しました。

DB上は関連が定義されていないのですが、自動生成されたマッピングを手で修正して
関連を追加してあげると、今後、自動生成できなくなってしまいます。

自動生成はしたいけど、マッピングに追記もしたい場合には、なにかいい方法はありますか?
817デフォルトの名無しさん:2005/09/24(土) 16:59:23
>>816
追加したテーブルだけ自動生成する
818816:2005/09/24(土) 22:09:33
>>817
DB側の修正が、テーブルが増えるだけならいいのですが、列が増えたりすることもあるので。
考えたら、DB側は、そんなに頻繁に変更されない(はず)ので、
初回だけ自動生成して、あとは自動生成せずに、手で変更分だけ修正と割り切ってもよいような気もします。
初回の全テーブルのマッピングを作ってくれるだけでも、相当楽なので。
819デフォルトの名無しさん:2005/09/26(月) 18:29:38
hibernateを利用してはいけない5つのシチュエーション
http://www.everes.net/145

………なんつーか、完璧な道具なんてどこにもありゃしないのに文句たらたらで
具体的な回避策も示さずにいるみっともないエンジニアという感じだな。

820デフォルトの名無しさん:2005/09/26(月) 18:54:11
全部が間違ってるわけではないが、その内容に従うと使えるシチュエーションのほうが少なくなる
(DBの複数対応が必要な場合ってそんなに多いか?)、
しかし現実はそーなってない、その場合世間を疑う前にまず自分を疑ってみるべきだと思うがどうか
821デフォルトの名無しさん:2005/09/26(月) 18:54:13
>>819
別に Hibernate マンセーじゃないけど、使えないのは Hibernate じゃなくて、
自分だという事に気が付いてないんじゃないかね。

そこに書いてある減少でハマったことはない。
822821:2005/09/26(月) 18:56:02
s/減少/現象/
823デフォルトの名無しさん:2005/09/26(月) 19:27:21
>Criteria#listをするとListにとびとびにオブジェクトが入っている
2.xから3にバージョンアップした時にこれにははまったな。
あまりにも横暴な変更にワラタ
824デフォルトの名無しさん:2005/09/26(月) 19:44:39
> 3もリストを毎回POJOに(しかも必要な関連のオブジェクトも含め)コピーするのは考えたくもありません。

解決策から目をそらす・・・
825デフォルトの名無しさん:2005/09/26(月) 20:05:04
つかえねぇ、つかえねぇと文句言うってことは使いたい、使いこなしたいの裏返しなのかな。
多少の回避策はあげていても結局は使うな、使うなって連呼しているところに違和感を感じる。

826デフォルトの名無しさん:2005/09/26(月) 20:11:38
O/Rマッピングって、一件のデータをいじくる場合に威力発揮するからHQLとかCriteriaとかあまり関係ない希ガス
827デフォルトの名無しさん:2005/09/26(月) 21:23:36
4のデータベース側にロジックって・・・
hibernate云々の問題じゃないような気がする
828デフォルトの名無しさん:2005/09/26(月) 22:09:23
ま、単なるグチブログにめくじらたててもね。
829デフォルトの名無しさん:2005/09/26(月) 22:42:13
グチブログか・・・・・・・・それでも、デルモヲチブログよりはマシだよな。
技術力はある人なんだけどな、どうしてあぁも壊れてるんだか_| ̄|○|||
830デフォルトの名無しさん:2005/09/26(月) 23:07:47
壊れてるから技術力あるんだろ
831デフォルトの名無しさん:2005/09/27(火) 00:00:13
Hibernate儲必死だなw
832デフォルトの名無しさん:2005/09/29(木) 00:16:41
Hibernateの思想がずれてるってのは同意だな。
4のように自動更新したりとか、EJB1,2に引っ張られてる部分が多いし、無駄機能を実装するためにわかりにい部分も多い。
ま、大体の問題はどうにかなるし、ほかにまともな選択肢は少ないけど。
833デフォルトの名無しさん:2005/09/29(木) 00:37:03
何でもO/Rマッピングでやろうとするのが問題な気が・・・
単純にテーブル単位でデータ持ってきて更新ってときは便利だし
それ以外はDbUtilsあたりでいいやと思ってるのだが
834デフォルトの名無しさん:2005/09/29(木) 00:42:35
デルモヲチブログテラワロスwww
835デフォルトの名無しさん:2005/09/29(木) 07:05:27
>>824
> 3もリストを毎回POJOに(しかも必要な関連のオブジェクトも含め)コピーするのは考えたくもありません。
> 解決策から目をそらす・・・
そこでDxOですよ

つうかこれでトラブるってことは、引っ張ってきたオブジェクトを
(RDB上のデータを更新する意図がないのに)触ってるってことだよな。

1000→1,000みたいな(MVCの方の)Viewでやるような編集を
引っ張ったオブジェクトをネタにやってて、
その編集結果をそのオブジェクトに上書き保存wとかやってる悪寒。

とはいえ、VBの時代じゃあるまいし、今時そんな設計ありえるのかね?
836デフォルトの名無しさん:2005/09/29(木) 12:22:01
>>835
hibernateのソースコード読んでみれ
元ネタにも触わって無くても更新されるって書いてあんべ
837デフォルトの名無しさん:2005/09/29(木) 12:32:36
更新したくなければevict()すればいいのに(マリー
838デフォルトの名無しさん:2005/09/29(木) 19:56:23
テーブル単体の更新・削除・挿入に関しては便利
結合し始めるは微妙?
839デフォルトの名無しさん:2005/09/29(木) 21:04:40
Seaser2 のS2Hibernate を使うと便利だよ。トランザクションも自動でやってくれるし、Sessionやコネクションの取得や解放も気にしないでロジックくめる。
パフォーマンスもそんなに悪くない。キャッシュが有効なときはJDBCより良いケースがある。全体的にコードの見やすさが向上するよ。

840デフォルトの名無しさん:2005/09/29(木) 22:35:49
テーブル設計から任せてもらえるなら是非使いたく候。
Hibernate が適用できそうにない案件ばっかで泣ける。
841デフォルトの名無しさん:2005/09/30(金) 09:51:33
>839
こんなところまで来て宣伝すんな
2行目seaser関係ねぇしw
842デフォルトの名無しさん:2005/09/30(金) 23:53:02
>>841
そういうお前はちゃんとつかいこなせているのか?戦闘力はいくつぐらいだ?
843デフォルトの名無しさん:2005/10/01(土) 01:10:17
>>836
ソースのどこ読めばいい?
844デフォルトの名無しさん:2005/10/03(月) 19:02:33
ところで、Oacleのパッケージでhibernate.dialectに設定する
RDBMSの方言を吸収するためのクラスを教えてくれ。

どうもマッピングでうまくいかねーorz
845デフォルトの名無しさん:2005/10/03(月) 19:04:51
↑の補足なんだけど
参考文献はこいつ

っ ttp://www.techscore.com/tech/Others/Hibernate/02.html
846デフォルトの名無しさん:2005/10/03(月) 19:25:09
>>844
マニュアルみれば、すぐわかるじゃん。
http://www.hibernate.org/hib_docs/v3/reference/en/html/session-configuration.html#configuration-optional-dialects
ちなみにこれは3.0のやつで、2.1だとパッケージ名違うので注意。
847デフォルトの名無しさん:2005/10/03(月) 22:06:39
デルモヲチ(デルモオタ?)
Re: hibernateを利用してはいけない5つのシチュエーション
848デフォルトの名無しさん:2005/10/04(火) 10:29:29
837はどっちかつーとネタであっていちいちevict()せにゃならんやり方に問題があると言いたくてだからマリーなわけなんだが
849デフォルトの名無しさん:2005/10/04(火) 18:38:49
>>848
かわいそうに。今頃必死でevict()入れてるよw
850デフォルトの名無しさん:2005/10/04(火) 21:59:20
equalsの定義が間違っているせいでupdateされちゃうってどういうこと?
851デフォルトの名無しさん:2005/10/04(火) 22:35:34
>>850
朝までにはk(1)さんが教えてくれるよ。
それにしてもスパム災難だな。
デルモヲチブログと比較されたせいで獄長の標的w
852デフォルトの名無しさん:2005/10/05(水) 02:03:10
シチュエーション4はあからさまに胡散臭いわ。
Dirty Flagはないけど、プロパティの変更を調べてUpdateしてたはず。
プロパティいじってんのに勘違いして全Updateと思い込んでるんじゃ?

Hibernateの更新操作の挙動って、仮想メモリの考え方(File Mapping)に
近くて、その辺を知ってる人にとっては扱いやすいと思うんだけどなー。

あるエンティティの関連エンティティをLazyなプロパティ経由でアクセスした
タイミングで、セッション中に存在しなかったら自動的にストレージから読み込む。
セッション中のエンティティが更新された(Dirty)なら適当なタイミング(flushなど)
で自動的にストレージに反映される。

セッション -> 物理メモリ
エンティティ -> ページ
プロパティ操作 -> メモリアクセス
データベース -> マッピング先のストレージ

ほら、似てると思わない?
853デフォルトの名無しさん:2005/10/05(水) 02:12:30
シチュエーション4は、
書いた奴が永続化オブジェクトを分かってないということでFA?
854デフォルトの名無しさん:2005/10/05(水) 18:43:29
FAくさいね。
後はスパムがそれを認めるかどうかだな。
あるいは某Aのように緘黙症になるかw
855デフォルトの名無しさん:2005/10/05(水) 23:50:01
獄長って誰のことですか?
856デフォルトの名無しさん:2005/10/06(木) 01:05:48
アナタのことです。
857デフォルトの名無しさん:2005/10/06(木) 08:51:36
結局、getterいじったから4の現象が起こったということでFAなのかな?
普通、問題が起こった瞬間にそこを疑いそうなもんだが・・・
858デフォルトの名無しさん:2005/10/06(木) 12:49:07
結局シチュエーション5は自分自身のことだったというオチですか。素晴らしい。
859デフォルトの名無しさん:2005/10/07(金) 03:09:06
大人気ない
860デフォルトの名無しさん:2005/10/07(金) 03:12:24
その粘着ぶりは大人気ない
861デフォルトの名無しさん:2005/10/07(金) 08:00:32
大人気なくても、おもしろいから良い。 Prologつまんね。
862デフォルトの名無しさん:2005/10/07(金) 09:33:52
スレ読んでないし
Criteriaしてるし
863デフォルトの名無しさん:2005/10/07(金) 09:48:03
人のハナシ聞いてないし…
864デフォルトの名無しさん:2005/10/07(金) 10:26:33
化粧してるし
865デフォルトの名無しさん:2005/10/07(金) 11:21:03
おっ、クリテリアがいる
866デフォルトの名無しさん:2005/10/07(金) 11:23:49
> 865
ワラタ
867デフォルトの名無しさん:2005/10/07(金) 12:01:47
>>861
空気読んでないし
868デフォルトの名無しさん:2005/10/07(金) 12:41:00
>>851
いや、スパムもブログの賑わいと言うし、一躍有名ブログ化はおいしいw
てか、獄長を起こした功績が大きい。久しぶりのJavaネタに俺様ウットリ。
海老の画像を全部アマゾンのアフィリンクに置き換えてJavaネタを書け
と言いたいw
869デフォルトの名無しさん:2005/10/07(金) 19:05:19
スパムは獄長を釣るエサだったクマー
870デフォルトの名無しさん:2005/10/07(金) 20:28:29
>>859-865のまとめ。

エビ「大人気ない」
エビ「その粘着ぶりは大人気ない」
koichik「おっ、クリテリアがいる」
エビ「人のハナシ聞いてないし…」
エビ「化粧してるし」
871デフォルトの名無しさん:2005/10/07(金) 21:39:34
エビジョンイル キタ━━━━━━(゚∀゚)━━━━━━!!!!
872デフォルトの名無しさん:2005/10/07(金) 21:46:15
エビジョンイルさんてサンプルまでエビなのが徹頭徹尾というか
首尾一貫というか、>>829に深く同意
873デフォルトの名無しさん:2005/10/07(金) 21:53:28
>>870
ありがとう、今気がついた・・・
874デフォルトの名無しさん:2005/10/07(金) 23:30:39
最後は
「Prologしてるし」
がいいな。
875デフォルトの名無しさん:2005/10/08(土) 00:04:31
ibatisでstruts見たいに、#formbean.innerbean.fireld#みたいに指定できないですか?
876デフォルトの名無しさん:2005/10/08(土) 00:47:32
やっとコメントがついたかと思ったら…
大人気ないw
877デフォルトの名無しさん:2005/10/08(土) 03:34:28
あの不透明感は大人気ないw
878デフォルトの名無しさん:2005/10/08(土) 03:47:58
> あ、あとそのうちでいいんで教えてください。

ヒント:トラックバック
879デフォルトの名無しさん:2005/10/08(土) 07:25:19
なんかかわいそうになってきた。
880デフォルトの名無しさん:2005/10/08(土) 12:51:05
結果的にはオレンジニュースに晒しものにされた形だな。
あそこに取り上げられなければ( ´_ゝ`)フーンで終わったのに。
881デフォルトの名無しさん:2005/10/08(土) 13:34:11
Open Session in View って、そんなに避けなきゃいけないものですか?

ガンガン使いまくってるんですけど。

更新系の処理後は、たいがいリダイレクトしちゃうんで、
プレゼンテーション層ではDBからデータひろってきて表示するだけ。

どのみち別セッションだし、ガーッてセッション開きっぱなしです。

まずいの?
882デフォルトの名無しさん:2005/10/08(土) 13:37:32
モヒカンデビュー未遂パターン

・大口を叩く
・オレンジニュースに取り上げられる
・2chに晒される
・獄長に見つかる
・コテンパン
883デフォルトの名無しさん:2005/10/08(土) 13:44:56
>>881
まずいと思うならまずいし、思わないならまずくない。
作るものとか考え方によるんじゃない?
884デフォルトの名無しさん:2005/10/08(土) 13:56:19
>>881
> Open Session in View って、そんなに避けなきゃいけないものですか?

困ってなければいんじゃね?

> 更新系の処理後は、たいがいリダイレクトしちゃうんで、

こういうのってよくあるのか?

> プレゼンテーション層ではDBからデータひろってきて表示するだけ。
> どのみち別セッションだし、ガーッてセッション開きっぱなしです。

それだと更新とその結果表示で同じDBアクセスしたりしないのか?
885デフォルトの名無しさん:2005/10/08(土) 14:04:58
>>884

>> 更新系の処理後は、たいがいリダイレクトしちゃうんで、
>
>こういうのってよくあるのか?

Redirect after post とか Redirect after submit とかいうパターンです。
ttp://www.theserverside.com/articles/article.tss?l=RedirectAfterPost

ある程度F5よけになります。

>> プレゼンテーション層ではDBからデータひろってきて表示するだけ。
>> どのみち別セッションだし、ガーッてセッション開きっぱなしです。
>
> それだと更新とその結果表示で同じDBアクセスしたりしないのか?
アクセスします。
あきらかに無駄ですが、 redirect after submit するメリットを優先しています。
886デフォルトの名無しさん:2005/10/08(土) 14:26:40
>>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を使い棄てるようなイメージで。。
大きな問題には遭遇してないですよ。
888デフォルトの名無しさん:2005/10/09(日) 20:53:59
>>887
OpenSessionInViewとは直接関係ない話。
HTMLフォームをサブミットしたリクエストでDBを更新した後
表示用のURLにリダイレクトして、そのリクエストでDBを参照して
画面表示する。
そうするとブラウザでF5しても表示用のURLがリクエストされるから
二重更新を回避できるのがメリットみたいだな。

それぞれのリクエストでは別々のSessionを使う。
>881はたまたまそのSessionをOpenSessionInViewしてる。
889デフォルトの名無しさん:2005/10/09(日) 23:07:24
Middlegen使ってOracle用のmappingを作ろうとしてるんだけど、普通にantのxml書いて実行すると
指定したテーブルが存在しないって言われちゃう。MiddlegenIDE(だっけ?)を使ってみても、対象の
テーブル一覧に何も出てこない。ネットで検索すると、同現象に遭遇してる人がちらほら居るんだけど
誰かMiddlegenでOracle用のマッピング作れてる人いる?
890デフォルトの名無しさん:2005/10/10(月) 00:21:44
>>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#みたいに指定できないですか?
普通にできてますけど・・・
失敗すんの?
893デフォルトの名無しさん:2005/10/11(火) 11:36:54
>891
>808 参照。
というかここ参照
http://www.hibernate.org/hib_docs/tools/ant/index.html
オプションは使ったことないんでしらん
894デフォルトの名無しさん:2005/10/11(火) 11:56:02
>>893
ありがとうございます。えーと、Toolsはjarの中身から取り出して使ってます。
URLにあったantタスクの使い方の中に、2.*の時に使われていたconfigurationの設定とその使い方に関する記述が無いため
3.*になってどっか逝ってしまったかな…と思った次第です。
895デフォルトの名無しさん:2005/10/13(木) 09:43:08
>>892
あ!すいません。記述ミスでした。
#formbean.innerbean[0].fireld# です。
strutsやvelocityでは、[0]は配列でもリストでも可能でしたのでibatisでもと思ったのですが、
そんなメソッドはないといわれ、[0]をメソッド名としてみてしまいます。
iterateタグでも一部で切るのですが、配列の場合はだめでした。
896デフォルトの名無しさん:2005/10/17(月) 17:30:27
HibernateでDBからデータを取得する場合、主キーが分かってる時は

Hoge hoge = (Hoge)session.load(Hoge.class, primaryKey);

みたいな感じで取得出来るのですが、主キー以外のカラム値しか分からない場合、
Hogeのオブジェクトにそのカラムの値のみをセットして、DBから一致するデータ全てを
取得する方法はあったりするのでしょうか?

Hoge hoge = new Hoge();
hoge.setVal("aaa");
List list = session.何らかのメソッド(hoge);

みたいな感じで。
もし、こういうのが出来ない場合は、テーブルのカラム数に応じた処理を書かないと
いけないのでしょうか?
897デフォルトの名無しさん:2005/10/17(月) 18:04:31
query.setProperties(obj)とかクライテリアクエリのExampleとか
898896:2005/10/17(月) 18:52:45
>>897

クライテリアクエリのExampleで出来ました!
ありがとうございます!
899デフォルトの名無しさん:2005/10/24(月) 12:04:44
Hibernateで主キーのUpdateって出来ますか?
今回の案件でHibernate使うか迷っててコレが出来れば使おうと思うんだけれど。
900デフォルトの名無しさん:2005/10/24(月) 12:14:37
やったことないけどevictしたあとupdateすればいけるんじゃない?
901デフォルトの名無しさん:2005/10/24(月) 14:17:35
主キーのupdateが必要なシチュエーションが思い浮かばない・・・
902デフォルトの名無しさん:2005/10/24(月) 15:11:37
自然キーを主キーにしちゃったところへ
お客様からコード洗替のお知らせが。とか。
903デフォルトの名無しさん:2005/10/24(月) 16:23:50
そりゃもうhibernateの出番じゃないな
904デフォルトの名無しさん:2005/10/24(月) 19:11:51
http://www.everes.net/151
今更ながら更新されておる喃。
905デフォルトの名無しさん:2005/10/24(月) 23:30:47
ファイルマンせーな人たちがDB使い始めるとなぜか主キー更新とか、
キーなしテーブルとか出来上がっちゃったりすること多い
906デフォルトの名無しさん:2005/10/24(月) 23:35:54
でも主キーを仮番で振るってのは結構ありがち。
907デフォルトの名無しさん:2005/10/25(火) 00:12:48
一意インデックス使うなら主キー必要ないんじゃない?とはいつも思ってる
908デフォルトの名無しさん:2005/10/25(火) 11:14:50
>>900のやり方ではイケなかった
updateするHQLを書けばイケるっぽかった
909デフォルトの名無しさん:2005/10/25(火) 11:54:14
ibatisで
Reader reader = Resources.getResourceAsReader(”設定ファイル”);
SqlMapClientBuilder.buildSqlMapClient(reader);
しているのですが、
一回実行し、設定ファイルを変更して、もう一度実行させても
設定ファイルの変更が更新されません。
修正した設定ファイルを毎回読込ますためにはどうしたらよいでしょうか。
910デフォルトの名無しさん:2005/10/25(火) 13:59:46
>>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
912デフォルトの名無しさん:2005/11/03(木) 00:54:52
ibatisのタグが貧弱なんで、velocity+ibatisでibatisの設定ファイル書いたら
いろんな条件でもかなり柔軟に設定できます。
これ結構お勧めかも・・・
913デフォルトの名無しさん:2005/11/03(木) 15:14:49
>>912
<isNotNull>とかのDynamic SQL周りでしょうか。
複雑なSQLは書いてないのでiBatisでも気にはなりませんでしたが
具体的にはどういう感じになるのでしょうか。
914デフォルトの名無しさん:2005/11/03(木) 20:11:26
>>913
俺は >912 じゃないが、分岐とループの明快さだろ。
SQL のテンプレ問題は HTML の動的デザイン問題に
類似している部分がある。

ってかもう、SQL も JSTL を標準に(ry
915デフォルトの名無しさん:2005/11/04(金) 17:04:45
>>912
オレもibatis遣いなので興味津々。
どこかにsampleをうぷしてくれたら、今後あなたのいる方向に足を向けて寝ません。
916デフォルトの名無しさん:2005/11/06(日) 01:29:27
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からいちいちシーケンスなどの値を取得してインスタンスへセット……
なんてことしないとダメなんですか?
917916:2005/11/06(日) 01:45:29
マニュアル読み返していたら、
7.4 複合識別子としてのコンポーネント の部分で、
複合キーを生成するためにIdentifierGenerator を使用することができません。代わりにアプリケーションはそれ自身の識別子を割り当てなくてはなりません。

とありますた(;´д`) まぁ仕方ないか…お騒がせしました

918デフォルトの名無しさん:2005/11/06(日) 01:50:06
まあ、、idのカラムは必須でないなら、
好きのようにIdentifierGeneratorを作れば大抵の場合幸せになる。
919デフォルトの名無しさん:2005/11/07(月) 10:43:52
ibatisって、クエリーのキャッシュを使用するようで、

select

条件1
 name
条件2
 age

の設定ファイルで、初回条件1で、2回目条件2だと、条件1が使用される仕様になっているようです。
キャッシュを無効にする方法知っていませんか。
920デフォルトの名無しさん:2005/11/07(月) 17:10:13
>>919
君の書いているのは例えば

<isNotEmpty prepend="and" property="employeeName">
EMPLOYEENAME like '$employeeName$%'
</isNotEmpty>

<isGreaterThan prepend="and" property="deptNo" compareValue="0">
DEPTNO = #deptNo#
</isGreaterThan>

こんな感じのソースのこと?

もしそうなら、オレの所ではキャシュされてる云々は発生してないけど・・・

も少し詳細な話と、『クエリーのキャッシュを使用するようで』の根拠を
書いてみて。
921デフォルトの名無しさん:2005/11/08(火) 22:37:26
Hibernate3 で、実行時にhibernate.cfg.xml を読み込むようですが、
CLASSPASSやjavaの実行時引数か何かでファイル名を指定することはできませぬか。


922デフォルトの名無しさん:2005/11/08(火) 23:16:53
923デフォルトの名無しさん:2005/11/08(火) 23:24:46
>>922
ありがd。自前で実装せにゃあかんのね。がんばってみる。
924デフォルトの名無しさん:2005/11/11(金) 14:33:45
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]
とか怒られるんだが。
925デフォルトの名無しさん:2005/11/11(金) 14:54:53
自己レス
one-to-oneでどーにかなりそうなふいんき、なんかキモいけど
926デフォルトの名無しさん:2005/11/12(土) 00:33:56
>>924
Hibernate3ならnot-found="ignore"
927デフォルトの名無しさん:2005/11/16(水) 22:37:20
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歳の子供を持つ親しか出てこなくなる
これは仕様だろうかバグだろうか?
928デフォルトの名無しさん:2005/11/17(木) 00:58:04
バグ(お前の頭の)
929デフォルトの名無しさん:2005/11/25(金) 02:15:13
そういえば、EJB3のRIってことになってるGlassfishだけど、このスレ的にはToplinkがオープンソースになったってことでもっと祭ってあげてもいいと思うんだけど。
930デフォルトの名無しさん:2005/11/25(金) 02:52:20
>>929
>Toplinkがオープンソースになった

マジで?本当ならうれしいなあ。
今Googleで検索したり、OTNを見たりしたけど、OpenSourceと書かれた
情報は見つけられなかったよ。どっかに情報ない?
931デフォルトの名無しさん:2005/11/25(金) 04:40:34
>>929-930
ひょっとして、
ttp://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050714/164660/


 米Oracleは,EJB3.0のPersistence API(EJB3.0仕様の一部である
永続化機能だけを切り離し,O/Rマッパー仕様として利用できるように
した)を,同社のO/RマッパーTopLinkの上で実装し,オープンソース
としてProject GlassFish(後述)に提供すると発表。また,JSF
(JavaServer Faces)のオープンソース実装MyFacesのプロジェクトに
参加した。

という記述のことか?
932929:2005/11/25(金) 04:59:46
>>931
そう、そういうこと。
933デフォルトの名無しさん:2005/11/25(金) 11:35:07
Sun===>TopLink
Oracle=>TopLink
BEA===>Kodo
JBoss=>Hibernate

で、

IBM===>???

IBMってどうするつもりなんだろうね。
まさかGeronimoで採用のOpenEJBに
開発陣をブチ込むとか?
934デフォルトの名無しさん:2005/11/25(金) 12:20:37
>>932
それ、TopLinkのオープンソース化じゃないんじゃないの?
935デフォルトの名無しさん:2005/11/26(土) 01:22:46
TopLinkってすごいの?
良く知らないんだけど....

EOFよりも良い?
936デフォルトの名無しさん:2005/11/26(土) 02:10:29
>>934
そのようですね。
TopLinkの一部は寄贈されるようですが、TopLinkは全然売り物のまま。
残念。

>>935
EOFは知らないけど、TopLinkは設定のGUIが楽で良い。
ただ、Oracleが買ったせいでOracle DBしかサポートしないことに
なっちゃってるのが他のDB使いたい人には問題だけど。
937デフォルトの名無しさん:2005/11/27(日) 20:27:11
BEAはウンKodoか… 死亡決定だな。
938デフォルトの名無しさん:2005/11/30(水) 17:13:54
939デフォルトの名無しさん:2005/12/01(木) 02:38:49
iBATISって何て読むの??
940929:2005/12/01(木) 04:04:40
イバッテマス(`・ω・´)
941939:2005/12/01(木) 08:32:06
>>940
ヽ(`Д´)ノ ウワァァァン

ほんとのこと教えてよ!!
942デフォルトの名無しさん:2005/12/01(木) 08:48:24
i いろんな
B バストみて
A あなたの
T ティンコから
I いっぱい
S 精子放出

どうもありがとうございました。
943デフォルトの名無しさん:2005/12/01(木) 10:04:27
>>939

本家に書いてあるぞ。これの一番下を嫁。

http://ibatis.apache.org/background.html
944デフォルトの名無しさん:2005/12/01(木) 10:33:35
>>941
大体質問に対してまともな回答がない時は、質問の仕方が糞か、誰も知らないか。
今回のように、少し調べれば分かるようなことを聞くとまともな回答は付かないだろうね。
945デフォルトの名無しさん:2005/12/01(木) 11:16:28
>>939
ぼくはアイバティスと読んでる
946939:2005/12/01(木) 23:43:30
>>943
>>945

ありがとー!!
すっきりしたよ!
947デフォルトの名無しさん:2005/12/03(土) 00:15:46
おいみんなきいてくれ。

JBossスレで、POJOの話をすると
刺客を送りつけられ殺し屋に暗殺されるということ
らしいが、なんでよ?
Hibernate使ってると暗殺されて行方不明扱いになっちまうのか?
948デフォルトの名無しさん:2005/12/03(土) 00:29:04
>>947
鮫島事件でぐぐれ。所詮その程度の話だ。
949デフォルトの名無しさん:2005/12/04(日) 23:04:15
iBATISってhibernateみたいなOne to Many ってできないんでしょうか?
950デフォルトの名無しさん:2005/12/05(月) 09:50:31
>>949
できる。

まずはTutorial、Developer'sGuideの順に目を通せ。
951デフォルトの名無しさん:2005/12/05(月) 19:28:08
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
>>950
Super Thanks!
953デフォルトの名無しさん:2005/12/06(火) 13:18:19
>>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丸出し失礼 )
954デフォルトの名無しさん:2005/12/06(火) 16:13:54
>>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>

956デフォルトの名無しさん:2005/12/13(火) 12:46:32
JDBCで扱えるならUserTypeでどーにかならんか?
957デフォルトの名無しさん:2005/12/13(火) 23:05:09
Hibernate 3.1 リリース記念。
958デフォルトの名無しさん:2005/12/14(水) 21:08:18
Mapping-Framework使いの皆さんに聞きたいんですが、
今回、Java⇔Oracleで、基幹システム(見積、受注、発注、出荷、在庫など)を
組むことになったのですが、
こういうのって意外と顧客独自な複雑な仕様があるので、テーブルもすごい何十個とかあります。
全てのテーブルのMappinngクラスを作ったりするもんなんですか?
複数テーブルとリレーション組んだりする時もその都度Mappinngクラス作るんですか?

なんか、結局SQL文コードに埋め込む形になっちゃいそうなんですが・・・
実際どうなんでしょうか?




959デフォルトの名無しさん:2005/12/14(水) 21:40:04
>>958
マッピングクラスなんか自動で作ってくれるツールがあるわけだから、ケチらず全部作れば?
960デフォルトの名無しさん:2005/12/14(水) 21:43:45
あと、SQLをコードに埋め込むかどうかは、マッピングクラスを全部作るかどうかとは関係ない話。
ORマッピング使ったからといって、全部SQL使わずにやるわけじゃないし。
961デフォルトの名無しさん:2005/12/14(水) 23:19:32
Oracle Toplinkはどうした。
962デフォルトの名無しさん:2005/12/14(水) 23:54:48
>>961
EJB3のRI
963958:2005/12/15(木) 09:27:28
レスありがとうございます。

>>959-960
本当にマッピングが、仕様の変更に迅速に対応できるのか、
マッピングとSQLの混在で、中途半端にならないか
という事が不安です。
逆に、こういう時はマッピングで、この時は、SQLとかいう
推奨の取り決めなどあるのでしょうか?

>>961-962
DB2やpostgreSqlも視野に入れてるので今回は使わない予定です。



964デフォルトの名無しさん:2005/12/15(木) 09:48:56
>>963

既存のDBを使わなくてはならい。そのDBがまんまOOにするには設計的に向いてない。
慣れないORMより目に見えるSQL。そんな君ならiBATISはどうだ?

PreparedStatementより遥かに楽だぞ。

http://ibatis.apache.org/
965964:2005/12/15(木) 09:56:21
追伸:知ってるかもしれんがTopLinkの一部はEJB3のRIの土台になる、
つまりOracleDB以外でもOKなオプソになる。

GlassFishでぐぐってみて。
966デフォルトの名無しさん:2005/12/15(木) 12:41:24
>>963
> 逆に、こういう時はマッピングで、この時は、SQLとかいう
> 推奨の取り決めなどあるのでしょうか?

1件単位の処理はマッピング
複数レコード一括処理はSQL

抽出はxQL
967958:2005/12/15(木) 14:10:25
>>964
iBATISいいですね、SQL部分とロジックを分けれるので、管理も楽そうです。

>>965
TopLinkとGlassFishは、調査中です。難しそうですね・・・

>>966
>複数レコードの一括処理
ってのは、いわゆるバッチ系でしょうか?
968デフォルトの名無しさん:2005/12/15(木) 14:26:30
バッチ系じゃなくても、普通にあると思うけど。
969デフォルトの名無しさん:2005/12/15(木) 15:18:38
>>968
たとえば、ある10件のデータを持ったテーブルの内容を画面に表示したいってのは
複数レコードの一括処理に入りますか?
970デフォルトの名無しさん:2005/12/15(木) 16:03:45
>>969
入らない。
けど、select書く。
971958: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が存在する。
973デフォルトの名無しさん:2005/12/15(木) 18:05:34
そろそろ次スレ準備ヨロ
974デフォルトの名無しさん:2005/12/15(木) 21:32:28
このスレのみんなは皆DbUnit使ってテストしてるの?
DbUnitはO-Rマッピングと世界が違って
どうも何か違和感を感じるんだけど
975デフォルトの名無しさん:2005/12/15(木) 22:18:51
>>971
構文上selectを省略できるという意味?
976デフォルトの名無しさん:2005/12/15(木) 23:42:46
>>975
SQLのSELECT文の事です
977デフォルトの名無しさん:2005/12/16(金) 00:27:29
SQLは集計を含んだ副問い合わせのときしかかかなかったな。
あとはHQLだった。
978デフォルトの名無しさん:2005/12/16(金) 00:29:56
クライテリアは、条件の設定が面倒だったので、使わなかった。
結合の制御もできないしね。
「select」はほとんど省略したけど、HQLを使った。

今ならprojectionが導入されたからクライテリアを使うかもしれない。
979デフォルトの名無しさん:2005/12/16(金) 06:48:19
J2EE5の説明みててアノテーションでORDER BY句が指定できるように
WHERE句も指定できるようにならないかな
980デフォルトの名無しさん:2005/12/16(金) 07:43:16
J2EE5などない。
981デフォルトの名無しさん:2005/12/16(金) 10:02:59
こういうのをモヒカン族っていうのかな
982デフォルトの名無しさん:2005/12/16(金) 10:12:42
データベースのテーブルや、フィールド名とかの命名規約ってあるのかな?
たとえば、得意先マスターだったら、今までは、
テーブル名:CUSTOMER
フィールド名:CUSTOMER_NAME
なんですけど、
マッピングを自動生成させると、
getCustomer_Nameっていうプロパティ名が生成されて気持ち悪いんですけど・・・
やっぱり、getCustomerNameであってほしいのですが、皆さんはどうしてますか?

データベースの推奨では、CUSTOMER_CODEとかアンダーバーで区切りなさいって良く聞くのですが・・・
983982:2005/12/16(金) 10:22:35
すみません誤爆でした。
customer_nameは、
getCustomerNameにしてくれました・・・
アンダーバーを使おうと思います
984デフォルトの名無しさん:2005/12/16(金) 12:13:06
次スレ:
Java⇔RDBのMapping-Frameworkを語るスレ Vol.4
ttp://pc8.2ch.net/test/read.cgi/tech/1134701684/
985デフォルトの名無しさん:2005/12/16(金) 17:56:01
>>958
オイラもそこは気になってるage
986デフォルトの名無しさん:2005/12/16(金) 18:17:26
Hibernate


ORマッピングって流行ってるの?
987デフォルトの名無しさん:2005/12/16(金) 20:58:03
ibatisのマッピングものたりない・・・。
listを出そうとするとエラーになる。
そのままtoString()で出してほしいのですが。
988デフォルトの名無しさん:2005/12/16(金) 21:03:58
モノにもよるとおもうが、オレ様の周りじゃ流行をこえて常識になってるけど
989デフォルトの名無しさん:2005/12/17(土) 11:39:11
ibatisしか使ったことねえのだが
hibernateって複合プライマリキーのテーブルの扱いがへんでねえか?
990デフォルトの名無しさん:2005/12/17(土) 13:45:38
>>981
村社会と比べたら全然モヒカン族の方が好意的だよ。
モヒカン族はテクノクラシー(技術至上主義)
村社会は社会主義社会、北朝鮮的。昔のnifty時代によく見られた
その名残としてブログや2chが出るまでは
閉鎖的な掲示板で村社会的なものがよく見られた。まさに洗脳に近い。
モヒカン族は人を洗脳しない。つっこみは入れるが意見を受け容れる
まさにアメリカ的民主主義。
991デフォルトの名無しさん:2005/12/17(土) 16:02:35
>>989
複合プライマリーキーをフィールドに持つIDクラスで管理する。
IDクラスはequals()とhashcode()をオーバーライドする必要があるが、Hibernate Toolsを使えば自動でやってくれる。

こんなかんじなんだけど、どう変なの?
992デフォルトの名無しさん:2005/12/23(金) 11:57:14
hibernateのレイジーなんたら。
Webアプリにはむかねえと思った
993デフォルトの名無しさん:2005/12/23(金) 11:59:31
>>992
なぜ?
994デフォルトの名無しさん:2005/12/23(金) 12:06:57
>>993
わかんね
カン
995デフォルトの名無しさん:2005/12/23(金) 12:13:44
>>992
つOpen Session In View
996デフォルトの名無しさん:2005/12/23(金) 12:49:54
>>992
HQLでJOINで取れば?
997デフォルトの名無しさん:2005/12/23(金) 19:26:35
野茂暗くないよ
998デフォルトの名無しさん:2005/12/24(土) 00:18:44
ばーかばーか
999デフォルトの名無しさん:2005/12/24(土) 00:19:04
ばーか
1000デフォルトの名無しさん:2005/12/24(土) 00:19:22
ばーかばーか
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。