1 名前:デフォルトの名無しさん mailto:sage [2005/12/16(金) 11:54:44 ] 前スレ: Java⇔RDBのMapping-Frameworkを語るThre Vol.3 ttp://pc8.2ch.net/test/read.cgi/tech/1090653286/ 過去スレ: 「Java⇔RDBのMapping-Frameworkを語るスレ Vol.2」(落ち) ttp://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 (PoEAA)] ttp://www.martinfowler.com/eaaCatalog/ あとは>>2 以降
75 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 21:36:14 ] HibernateやEJB3.0,iBatis程度をありがたがるjava技術者は哀れだな。
76 名前:デフォルトの名無しさん mailto:sage [2006/02/11(土) 22:03:12 ] ふむ、じゃあ何をありがたがろうか?
77 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 10:24:46 ] HibernateやEJB3.0,iBatisよりもADO.NETの方が優れている理由は、ORMとしての 実力は大きく変わらないが、Viewまで含めて.NETの機能が練られているところだろう。 いくらDAOのコーディング量が減っても、部分最適にしかならないから工数が減らない。
78 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 15:35:39 ] じゃあViewにWicketってことで終了。
79 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 16:26:54 ] Clickは?
80 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 16:29:22 ] 所詮は寄せ集めだな。
81 名前:デフォルトの名無しさん mailto:sage [2006/02/12(日) 21:59:44 ] フロントから裏までWebObjectsで終了じゃん。
82 名前:デフォルトの名無しさん mailto:sage [2006/02/13(月) 13:52:52 ] >>80 それをいうと「寄せ集めと大差ないクオリティのXXX(値は各自の信仰に依存)って何よ?」って話になるからやめれw
83 名前:デフォルトの名無しさん mailto:sage [2006/02/13(月) 17:48:53 ] 漏れ寄せ集めの方が好きだぬ。 なんかeclipse VS netBeans(あるいはvisualStudio)の 議論を見てるみたい。目的目標出さずに道具の議論って あんま意味ないよ。
84 名前:デフォルトの名無しさん [2006/02/14(火) 02:34:07 ] 1000行のデータを1ページ50行ずつでページングしたりする時に、 各ページに必要なデータだけをDBからロードするようにしたいんだけど この場合はどうやればいいんだ? 当方Hibernate3を使用してます。
85 名前:デフォルトの名無しさん mailto:sage [2006/02/14(火) 08:09:30 ] >>84 ttp://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html#objectstate-querying-executing-pagination
86 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 15:57:21 ] Hibernate3初心者ですが、ちょっと教えて下さい。 many-to-one のマップで、もし該当データが存在しなくても怒られない方法、 知りませんか? 例えば <class name="item"> <id name="id"/> <many-to-one name="bid"/> </class> <class name="bid"> <id name="id"/> <pro name="amount"/> </class> これで from Item item left join fetch item.bid をやって、 取得したリストを表示させると、bidを取得できなかったitemの item.bid.amountをgetすると、 LazyInitializ E org.hibernate.LazyInitializationException TRAS0014I: 次の例外がログに記録されました。 org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed と、アボンです。 session閉じて分離オブジェクトになってんだから、良いじゃん、 と思うんだけど、教えて下され。
87 名前:デフォルトの名無しさん mailto:sage [2006/02/15(水) 21:46:00 ] not-null="ignore"
88 名前:デフォルトの名無しさん mailto:sage [2006/02/16(木) 08:24:05 ] OracleがJBoss買収したら、TopLinkとHibernateは一つになるのか? あと、JBoss CacheをOracleがどう使うのか気になるな
89 名前:デフォルトの名無しさん mailto:sage [2006/02/16(木) 17:30:07 ] EJB3でTopLinkとHibernateはひとつになってる希ガス
90 名前:デフォルトの名無しさん mailto:sage [2006/02/16(木) 19:03:37 ] APIが一つにまとまったからね。 TopLinkの「放出されていない部分」っていうと、現状JDeveloperに 載ってるGUIツールの部分や分散環境対応部分が大きいのだっけ? oc4jとJBossコンテナはどう棲み分けるのかなぁ、Oracleって GlassFishも支援してるから、まるでOracle一つの内で三つ巴に なってるみたいなイメージだね。 買収成功祈る>Oracle
91 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 01:52:07 ] BEA、KodoをOpen JPAとしてオープンソース寄贈 pcweb.mycom.co.jp/news/2006/02/15/344.html
92 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 02:58:08 ] WebアプリでHibernate EntityManagerを試してみたいんだけど、 persistence.xmlはどこにおけばいい? アプリルート/META-INF に置いても読み込めません・・・orz Persistence.createEntityManagerFactory("em1"); でコケます。 No Persistence provider for EntityManager named em1 とスタックトレースに出力されます。 ("em1"はpsersistence.xmlの<persistence-unit>要素のname属性に指定した名前) WEB-INF/classesに置いてみても同じです。 Ejb3Configurationを使ってhibernate.cfg.xmlを読み込んでEntityManagerFactoryを 作る方法は成功しました。 環境はJDK1.5.0/Tomcat5.5.15/Hibernate3.1.2/hibernate-entitymanager-3.1beta6 です。
93 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 03:45:20 ] なんで唯一試すのがMETA-INFなんだろう・・・
94 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 04:08:23 ] >>93 スミマセン。 > WEB-INF/classesに置いてみても同じです。 と書いたように、他にはWEB-INF/classesも試しています。
95 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 07:28:25 ] >>92 WEB-INF/classes/META-INF/persistence.xml classpath内の「META-INF/persistence.xml」を検索しているみたい WARのMETA-INFに入れても認識しないので注意
96 名前:デフォルトの名無しさん mailto:sage [2006/02/17(金) 08:04:49 ] >>95 うぉぉぉぉぉ!!!!! 激しくサンクスっ! うごきましたー!
97 名前:デフォルトの名無しさん [2006/02/26(日) 16:58:56 ] SpringのgetHibernateTemplate().findで検索をかけたら、NoClassDefErrorが 発生しました。 loadAllだと問題なく抽出されるし、クラス名もちゃんとフルパスで指定 してるんですが、何が間違ってるんでしょうか。
98 名前:デフォルトの名無しさん mailto:sage [2006/02/28(火) 23:35:35 ] >>97 さすがに、HibernateとSpringのバージョンくらいは書いた方が良いのでは・・・?
99 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 01:32:48 ] これは失礼いたしました。 spring1.2.6とhibernate3です。
100 名前:デフォルトの名無しさん mailto:sage [2006/03/01(水) 17:14:08 ] Hibernateに関してですが、マッピングファイルに <version name="version" unsaved-value="negative"/> を記述して、バージョン管理をしていますが、このバージョンを 上げずに更新をするという処理は可能なのでしょうか。 一般的にはこのような処理は行わないと思いますが、2つのシステム で同じテーブルを読みに行くとき、他方のシステムは特定のカラムを 更新された場合、更新の検知は不要と考えており、上記のような処理 ができないかと考えました。
101 名前:デフォルトの名無しさん [2006/03/01(水) 23:30:21 ] >100 細かい粒度でクラスを書き、<component> でマッピングしましょう。 とかベストプラクティスに書いてあるから、Aシステムで更新するカラムと Bシステムで更新するカラムを別クラス(1テーブル)にしたら? とかいってみちゃったりして。 僕は上記の方法をとらないときはからなずバージョンによるロックかけるよ。
102 名前:デフォルトの名無しさん mailto:sage [2006/03/02(木) 01:04:51 ] >>100 排他制御はしないの?
103 名前:デフォルトの名無しさん mailto:sage [2006/03/02(木) 08:23:29 ] >> 101 ありがとうございます。 二つのクラスにしてみます。 >> 102 テーブルtにf1,f2,vというカラムがあって、 vがバージョン番号だとすると、Aシステムは、 f1,f2を更新する可能性があって、Bシステムは、 f1のみ更新します。 f1を更新した際は、システムA,B共にf3を更新します。 ですから、Aシステムがf2のみを更新する際は、 排他制御は必要ないと考えたのですが、いかがでしょうか?
104 名前:デフォルトの名無しさん [2006/03/02(木) 11:03:14 ] >103 1)Bシステム:データ取得(f1=a,f2=b,v=1) 2)Aシステム:データ取得(f1=a,f2=b,v=1) 3)Bシステム:データ保存(f1=a→y,f2=b,v=1→2) 4)Aシステム:データ保存(f1=a,f2=b→x,v=1) 排他制御死ぬほど必要じゃね? 3)がせっかく入力したf1はどこいくんだ?
105 名前:デフォルトの名無しさん [2006/03/02(木) 11:06:55 ] >100 100よ!私101だが、俺てっきりAシステムはf1のみ更新、Bシステムはf2のみ更新 を行うと思ってたからcomponentのはなしなんかしちゃったよ。 AとBで更新するカラムがかぶってるならテーブル1個で普通にバージョンによる 排他制御してくれ。理由は104が知っている。
106 名前:デフォルトの名無しさん [2006/03/02(木) 11:07:43 ] ↑ 誤:テーブル1個 正:テーブル1個、クラスも1個
107 名前:100 mailto:sage [2006/03/02(木) 17:15:09 ] ごめんなさい。記述が間違っていました。 × f1を更新した際は、システムA,B共にf3を更新します。 ○ f1を更新した際は、システムA,B共にvを更新します。 同じカラムを更新する場合はバージョンを両システムとも上げます。 >>104 4) のところでupdate文にwhere v=1 が含まれると思いますので、 エラーにならないでしょうか? >>105 両システムの更新するカラムがぶつかっている場合、ぶつかっている 箇所のみ排他処理をするのではまずいですか?
108 名前:デフォルトの名無しさん mailto:sage [2006/03/03(金) 00:17:58 ] >>107 dynamic-updateを使うってこと? 自分のとこでは使ってないから、dynamic-updateが確実なのかどうかよくわからないけど その場合でも、Aシステム用のクラスにはVersionカラムを定義せず、 ナンバーアップも排他制御も全て手作りで書くのが無難だと思う 業務的に必要なら仕方ないけど 更新前に余計にSQL発行するわけでもないし そこまでして排他制御を避ける理由がよくわからないな
109 名前:108 mailto:sage [2006/03/03(金) 00:19:54 ] × 排他制御を避ける理由 ○ バージョニングを避ける理由
110 名前:100 mailto:sage [2006/03/03(金) 09:25:31 ] >>108 バージョニングを避ける理由は、例として、 1) Bシステム : データー取得 (f1=a,f2=b,v=1) 2) Aシステム : データー取得 (f1=a,f2=b,v=1) 3) Bシステム : ユーザーがデーターの入力中 4) Aシステム : データー保存 (f1=a,f2=b→x,v=1→2) 5) Bシステム : 更新時エラー(バージョンが違うため) 3のデーター入力は入力項目が多いです。 4の更新内容は、Aシステムのみが使用するデーターカラム の更新のみで、Bシステムの動作には影響しません。 ユーザーの作業効率を考えると、システムに影響がないの であれば、5にてエラーとしない方がよいと考えました。
111 名前:デフォルトの名無しさん [2006/03/03(金) 18:29:20 ] >110 チミのいってることはへんでないヵ? (103)にて >Aシステムは、f1,f2を更新する可能性があって、Bシステムは、f1のみ更新します。 (110にて) > 3(=Bシステム)のデーター入力は入力項目が多いです。 ゆえにf1はたくさんの入力項目である。したがってAシステムも(人間が手で入力するのか自動で登録するのかは全く別として) たくさんの項目を設定する。 だ か ら 、 たくさんの項目を設定したAシステムのf1が、ちまちま手入力したBシステムで入力したf1によってけされてしまうだろ?大問題ではないの? それどころかAシステムでバージョンチェックしなかったらAシステムを同時に2人で使ったらデータが後勝ちしちゃうんだぞ。 そんなのDB使うときのポリシーとして許されるものじゃないんじゃない? だめだ。どう考えてもバージョンチェックによる排他制御は必須としか思えない。 > >>104 > 4) のところでupdate文にwhere v=1 が含まれると思いますので、 > エラーにならないでしょうか? ヴァージョンチェックを有効にしたらそりゃエラーになるよね。ただ、Aシステムはバージョンチェックをしたくないんでしょ? だからエラーチェックをしない前提だからべつにどうでもいいんじゃない?どうでもいいから単純にバージョンあげわすれただけ。 ちゃんとバージョンは4)のところで1→2にあげましょう。
112 名前:100 mailto:sage [2006/03/03(金) 18:46:20 ] >>111 > だめだ。どう考えてもバージョンチェックによる排他制御は必須としか思えない。 両システムが更新するカラム(f2)のみ排他制御を入れるのではまずいでしょうか? > Aシステムはバージョンチェックをしたくないんでしょ? Bシステムのみ使用するカラムはバージョンチェックをしないという方針です。 他の箇所はバージョンチェックします。
113 名前:デフォルトの名無しさん [2006/03/03(金) 21:38:04 ] >112 おい!、103の書き込みをちゃんと見ろ! 両方更新するカラムはf1だろ! Bシステムのみ使用するカラムなんてないだろ! 前提条件をころころかえるんじゃないよ。 わけがわからなくなるだろ!
114 名前:デフォルトの名無しさん [2006/03/05(日) 11:43:39 ] Hibernateってサニタイジングは自分でやらなきゃいけないの?
115 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 12:05:08 ] >>114 DBごとの駄目文字を上手いこと自動変換してくれるか、ってこと??
116 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 12:14:13 ] >>115 狭い意味だと文字列末尾の'\0'を取り去ることだけになっちゃうね。 広い意味だといくらでもひろがっちゃうし。 >>114 というわけで、どこまで考えてるのかを、お願い。
117 名前:デフォルトの名無しさん mailto:sage [2006/03/05(日) 12:32:40 ] PreparedStatementでやってくれる程度の処理
118 名前:デフォルトの名無しさん [2006/03/06(月) 18:53:18 ] Hibernateで、SQLのgroup byみたいなことするのって、SQL直書きでQueryクラスとかに渡すしかないのでせうか? criteriaはそんなこともできんのですか?
119 名前:デフォルトの名無しさん [2006/03/06(月) 19:06:13 ] お願いします!わかる人答えてください! 掲示板に書き込みしたのをパスワード入力して 消したら完全に消えるんですか???IDとか
120 名前:デフォルトの名無しさん mailto:sage [2006/03/06(月) 20:01:57 ] >>119 スレタイ読んで出直してくださいね。どこでも質問すればいいってもんじゃないです。
121 名前:デフォルトの名無しさん mailto:sage [2006/03/07(火) 01:17:02 ] >>118 HQLなら普通にgroup by書けばいい Criteriaは使ってないからよくわからんが↓あたりじゃない? ttp://www.hibernate.org/hib_docs/v3/reference/en/html/querycriteria.html#querycriteria-projection
122 名前:デフォルトの名無しさん [2006/03/07(火) 10:25:40 ] 返答どもです。 Hibernateのサイト見てやったらObjectの配列のListを返すとかいう美しくない結果にたどり着きましたが、それをとっかかりに以下の答えにたどり着きました。 これでClassA型で値が返ってきました。 //テーブルA(マスタ。ClassA)のうち、テーブルB(トランザクション。ClassB)にひとつ以上参照している行が存在するものを取得。返り値はClassA型のList Criteria crit = getSession().createCriteria(ClassA.class); crit.createCriteria("classB"); crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); ありがとうございました。
123 名前:デフォルトの名無しさん mailto:sage [2006/03/09(木) 09:57:53 ] ibatisのタイプハンドラには、String[]は型として使用できないのでしょうか。
124 名前:http://www.vector.co.jp/soft/win95/util/se072729.html mailto:http://msdn2.microsoft.com/ja-jp/library/h2k70f3s.aspx [2006/03/18(土) 22:04:51 ] TextSS のWindowsXP(Professional)64bit対応化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか? そういや64bitにネイティブ対応している2chブラウザてありましたっけ?
125 名前:デフォルトの名無しさん mailto:sage [2006/03/18(土) 22:41:29 ] >>124 あちこちにマルチ乙
126 名前:デフォルトの名無しさん mailto:sage [2006/03/19(日) 08:50:46 ] hibernateを使おうと考えています。 既存のマスタが論理削除で管理されている場合、 論理削除チェックはどこでやるもんなんでしょう?
127 名前:デフォルトの名無しさん [2006/03/23(木) 23:23:50 ] 当方マカーです(ごめんなさい) Hibernate3を使い始めたんですが、hbmを作るのが面倒です(PostgreSQLでテーブル100個ぐらいある)。 eclipseにプラグインを入れてもエラーで墜ちまくるので実用的じゃなさそうです。 eclipse以外に、PureJavaでつくられたツールとかでテーブルを観て自動的にHibernate3用のhbmをつくってくれるものありませんか。
128 名前:デフォルトの名無しさん mailto:sage [2006/03/24(金) 11:12:39 ] マカーって自己紹介の意味が分からんし謝る意味も分からんがw www.hibernate.org/hib_docs/tools/reference/en/html_single/#ant これはどうですか
129 名前:デフォルトの名無しさん mailto:sage [2006/03/24(金) 15:24:35 ] マカ ttp://www.associe-net.co.jp/maca/
130 名前:デフォルトの名無しさん mailto:sage [2006/03/27(月) 18:58:40 ] OS:WindowsXP SP2 DB:Oracle XE O/R-Mapping Framework:iBATIS2.1.7 環境は上記の通りなんですが、 ttp://opensource.atlassian.com/confluence/oss/display/IBATIS/Oracle+REF+CURSOR+Solutions にあるような感じで、Procedureからの戻り値(OUTパラメータ)をBeanにマッピングするっていうようなことは出来るんですかね? 試してみたのですが、ResultSetが戻り値で返ってきちゃうんですよ。 ProcedureでのBeanとのマッピングってムリ?
131 名前:デフォルトの名無しさん mailto:sage [2006/04/07(金) 00:34:01 ] HibernateでDTOパターンを使い、更に排他制御を行いたい場合 バージョンカラムを含めた形でDTOに値をコピーし、 更新時に再びDTOから永続化クラスに詰め直してupdateする・・・という手順でいいの? 遅延ロードを設定していて、値を取得していない関連オブジェクトがフィールドにある場合、どう扱ったらいいのだろうか?
132 名前:デフォルトの名無しさん mailto:sage [2006/04/09(日) 12:42:56 ] 今頃なんだけど、OpenSessionInViewってどうなのかな? 個人的にはDAOから取り出したオブジェクトはDBから縁が切れていてほしい んだよね。なんかJSPで画面出してるときに、ここでDBになんかあったらど うしようとか考えるのが気持ち悪いというか。 とはいえDAOで似たような中身のオブジェクトに詰め直すというのも冗長だし。 みんなどうしてるの?
133 名前:デフォルトの名無しさん [2006/04/09(日) 13:16:57 ] リクエストのたびにhibernateのSessionつくってフェラチオして そのあとSessionをすぐにクローズしてる。Sessionはなるべく短く、短く。
134 名前:デフォルトの名無しさん mailto:sage [2006/04/09(日) 13:18:02 ] すまん、フェラチオ→フェッチ だ orz
135 名前:デフォルトの名無しさん mailto:sage [2006/04/09(日) 14:10:17 ] >>133-134 ( ゚д゚) _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄ ( ゚д゚ ) _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄ ( ゚∀゚ )アーッヒャヒャヒャヒャヒャヒャヒャヒャヒャヒャ _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄
136 名前:デフォルトの名無しさん mailto:sage [2006/04/09(日) 17:30:03 ] >>133 お茶噴いた
137 名前:デフォルトの名無しさん mailto:sage [2006/04/09(日) 19:08:21 ] 相当短いんだろうな
138 名前:133 mailto:sage [2006/04/09(日) 21:22:50 ] すまねぇなぁ(;´д`) フェまで入力してATOKだとtabで自動変換するからそのままreturnおしたのさorz 普段どういう文章打っているかがバレバレだぜ〜
139 名前:デフォルトの名無しさん mailto:sage [2006/04/09(日) 22:29:35 ] 短く、短く
140 名前:デフォルトの名無しさん mailto:sage [2006/04/09(日) 23:29:17 ] 今はかってみたら16cmだった。ふつう?
141 名前:デフォルトの名無しさん mailto:sage [2006/04/10(月) 00:03:50 ] >>140 日本人としてはちょっと長めらしい・・・。 なんて話はさておき、 Hibernateでは主キーがないテーブルのマッピングはできないんだな。 まあ当然なんだろうけど・・・。
142 名前:デフォルトの名無しさん mailto:sage [2006/04/10(月) 06:58:11 ] Hibernateフェチ
143 名前:デフォルトの名無しさん mailto:sage [2006/04/10(月) 11:21:34 ] >>140 うちのダンナよりは長いよ
144 名前:デフォルトの名無しさん mailto:sage [2006/04/10(月) 13:38:04 ] >>133 てめえ人様の腹を捩らすとは何事だゴルァ
145 名前:デフォルトの名無しさん mailto:sage [2006/04/10(月) 13:39:15 ] >>140 お前金持ちだろ。 ピーナッツ食いまくって水ばっか飲んでるだろ。 それにオナニー回数も少なめだな? チンポの長さと将来成功することと何か関係があるらしいぞw
146 名前:デフォルトの名無しさん mailto:sage [2006/04/10(月) 14:04:55 ] >>140 が使った道具 アンドロペニス 男性器増大医療器具 送料無料 www.liquidsky.co.jp/
147 名前:132 mailto:sage [2006/04/10(月) 18:02:27 ] 少しはまじめな話題を振ったつもりだったのに 133のバカチンコのおかげで……orz
148 名前:デフォルトの名無しさん mailto:sage [2006/04/13(木) 01:58:13 ] CayenneがApache Incubatorに入ったね。 HibernateもJBOSSの支援を受ける中、ObjectStyleだけで支えるのは大変だと いうことかな。 おれはこのORマッパー、結構好きなんで、Apache加入後のiBatisのように、 着実に進歩していって欲しい。 とりあえず1.2は結構いい。
149 名前:デフォルトの名無しさん [2006/04/13(木) 18:22:12 ] >132 >133 OpenSessionInViewでもリクエストのたびにSessionはクローズしているとおもうが。 ただモデル(もしくはコントローラ)でクローズするか、View層でクローズするかの違い。 だからどっちでおこなってもSessionは短い、短い。 こんな事象のときにOpenSessionInViewは効果を発揮する。 【前提】 A-B-Cと各々1:n関連したテーブルがあり、画面ではその全てを表示する。 【OpenSessionInViewを使用したら】 HQLは「from A」でOK。あとはView層でかってに遅延ロードによってBとCはロードされる。 【普通にやる場合】 HQLは AとBとCをJoinしなければならない。 または、「From A」として取得した結果をループでまわして遅延ロードを発生させなければならない。 まあ、こんな場合はOpenSessionInViewをつかったら楽々ですよ。 DAOから取得したA EntityクラスをFormにつっこんだら終わりだもんね。
150 名前:149 [2006/04/13(木) 18:40:57 ] 続き でも問題はあるのだよ。 【問題1】 遅延ロードは沢山のSQLを出力するから嫌いだ。 じつは、ふつうに遅延ロードをやると確かに遅延しない場合に比べて遅ーいばあいがあるね。 でも、以下のありがちな前提条件と、mappingの設定方法が合わさると、はやいのだ。 【前提条件】 1.次の10件みたいなページング機能が要求されている。 そしてその実装はHQLではなく、汎用的にView層で行っている。 2.HQLまたはSQLでJoinするとえらく複雑でOracleのほうでコストがすごい。 【対処】 前提1の対処 ページングがあるってことは、遅延ロードは10件分しかしなくていいよね。 でも遅延しなけりゃデータ数分Javaのメモリまでは展開されるんだからデータ件数によって は遅延のほうがはやくなる。 それでも1件1件SQLが発生するのに抵抗がある人は、Hibernate-mappingの<Set>タグの Attributeで「batch-size」ってのがあるんで、ここを20とかにすれば20行一挙に取得するSQLが 発行される。これは便利。 前提2の対処 遅延なしでOracleのコストがかかっている場合は、SQLを単純になるように分割したら 分割したほうが速くなる ほら、共有プールのサイズとかあんまとれなくて、SQLであるコスト超えたら突然すごく 遅くなる場合あるじゃん。そんなときはjoinはずすとコストが下がるからサクサクと結果が かえるようになる(こともあるよね)
151 名前:149 [2006/04/13(木) 19:13:51 ] つづき 【問題2】 一覧表示系は問題ないが、一覧入力系で、かつカンマ区切りの数値や日付の入力がある。 【前提】 OpenSessionが機能してうれしいのは唯一View層での遅延ロードなのだから、そういう前提にする。 A-Bという1:nの関連があり、画面はAとBを同時に入力、Bのほうに数値と日付の入力がある。 JSFを使うとコンバータの機能があるから、多分簡単に解決する。だから前提はStrutsとする。 【対処】 Strutsで実装すると、カンマ区切りの金額、日付に対応するFormのAtributeはStringになると 思いますが、Bは遅延ロードの前提で、かつDBではNumber型やDate型なのでJavaの型は BigDecimalとDate型とかにならざるをえません。 でもValidateのためにStringは別途必要です。 HibernateではCustom型を定義できるので、BigDecimalとDateの型のカスタム型を作成して、 カスタム型はBidDecimalとString型を内部では同時にもつように定義しておけば、 ・ValidateはStringのほうで行い ・うまくBigDecimalに変換できるのであれば内部のBigDecimalのほうに値を移行 ・あとはForm内のEntityをSaveすれば、DBに保存するようにUserTypeのコーディングを行う。 こんなことをやれば、コーディングレス(FormのStringからEntityへデータを移送するコードを 数値・日付のプロパティ分似たようなロジックを作ることがなくなる)で一覧入力系の 実装が可能。 まあ逆にそこまでしないと一覧入力系で遅延ロードの恩恵が得られないので、一覧入力系は 遅延ロードに頼らないというのも1つの手かもね。
152 名前:130 mailto:sage [2006/04/14(金) 21:56:30 ] DBのデータ件数が少ない場合、別にPreparedStatementでも そこまで実行速度的に変わらんので、SQL直書きでもいいかな、と。 いちお、SSQLLibってのがあるらしい。 結局(PL/SQLだと)自分でResultSetをBeanにマッピングしないとダメか・・・。 StoredProcedureとBeanのマッピングってHibernateでもムリなん? Hibernate使ったこと無いので。 >>133 (*^ー゚)b グッジョブ!!
153 名前:デフォルトの名無しさん mailto:sage [2006/04/14(金) 23:29:58 ] (133の次のナチュラルな下ネタを待っているのはオレだけすか?)
154 名前:デフォルトの名無しさん mailto:sage [2006/04/19(水) 17:15:25 ] 他人が作成した既存のものを改修することになったのですが、iBatisのsqlmapを使用しているプログラムでした。 sqlmapconfig.xmlには、こんな風に書かれていました <transactionManager type="JDBC"> <dataSource type="JNDI"> <property name="DBJndiContext" value="java:comp/env/jdbc/test"/> </dataSource> </transactionManager> <sqlMap resource="sqlMap/test.xml"/> これで1データソースに対してクエリを発行していると思うのですが、 これを2種のデータソースを使い分けるように変たいと思っています。 そもそもデータソース2種を使い分けることが可能なのでしょうか?
155 名前:デフォルトの名無しさん mailto:sage [2006/04/20(木) 00:46:37 ] >>154 TomcatなどのServlet Container レベルで考えると、JNDI経由で複数のDataSourceを取ることはできる。 > <dataSource type="JNDI"> > <property name="DBJndiContext" value="java:comp/env/jdbc/test"/> > </dataSource> この辺の記述はまさにServlet Containerの設定をそのまま持ってきてるようにも見えるので (「java:comp/env/jdbc/test」というあたり)、iBatisでも出来るんだろうと思う。 でもiBatis使ってないのでその先は分からない。
156 名前:デフォルトの名無しさん [2006/04/24(月) 00:53:53 ] Javaじゃなくて申し訳ないんだけど、NHibernateでCollectionマッピングってみんな何使ってやってる? Setとかの代わりの定番ってある?
157 名前:デフォルトの名無しさん [2006/04/24(月) 01:50:24 ] >>154 String resource1 = "resources/sqlmapconfig1.xml"; Reader reader1 = Resources.getResourceAsReader (resource); SqlMapClient sqlMap1 = SqlMapClientBuilder.buildSqlMap(reader1); String resource2 = "resources/sqlmapconfig2.xml"; Reader reader2 = Resources.getResourceAsReader (resource); SqlMapClient sqlMap2 = SqlMapClientBuilder.buildSqlMap(reader2); try{ sqlMap1.startTransaction(); sqlMap2.startTransaction(); ・・・ sqlMap1.commitTransaction(); sqlMap2.commitTransaction(); (*) }catch(Exception ex){ sqlMap1.rollbackTransaction(); sqlMap2.rollbackTransaction(); }finally{ sqlMap1.endTransaction(); sqlMap2.endTransaction(); } とかは駄目? (*)のところで異常が起きると変な事が起きそうだけど ミッションクリティカルなシステムぢゃなきゃだいじょうぶでしょう・・・
158 名前:デフォルトの名無しさん [2006/04/25(火) 23:26:42 ] Hibernateって何て読むんですか?
159 名前:デフォルトの名無しさん mailto:sage [2006/04/25(火) 23:38:41 ] >>158 ひべるなーて
160 名前:デフォルトの名無しさん mailto:sage [2006/04/25(火) 23:50:59 ] >>158 はいばーねいと、でいいんじゃないの?
161 名前:デフォルトの名無しさん mailto:sage [2006/04/26(水) 00:59:50 ] 冬眠って読むんだよ
162 名前:デフォルトの名無しさん [2006/04/26(水) 14:39:18 ] >158 はぁい、ばーねいと! (やあ、ばーねいと) あい、ばーてぃす!(いいえ、わたしはばーてぃすです。)
163 名前:デフォルトの名無しさん mailto:sage [2006/04/26(水) 14:48:17 ] カイ! エ〜ン ・゚・(ノД`)・゚・
164 名前:デフォルトの名無しさん mailto:sage [2006/04/26(水) 14:52:21 ] ハーイバネット、ハーイバネットぉ〜♪ 夢のハイバーネットたかたぁ〜♪
165 名前:デフォルトの名無しさん mailto:sage [2006/04/26(水) 19:14:12 ] Hibernateって、マッピングするときBean指定しないとダメなんですか。 ibatisではHashMapが使用できて、key=カラム名、value=値 で取得可能なのですが。
166 名前:デフォルトの名無しさん mailto:sage [2006/04/26(水) 22:16:20 ] いや別にMapが欲しいだけならDbUtilだけでいいんだし....
167 名前:デフォルトの名無しさん [2006/04/26(水) 23:13:32 ] だれかJavaドメインモデルの実践的な実装を解説した書籍を教えてください。 サービス、ドメイン、DTO、エンティティなど単語はよく聞きますがUML 図ばっかりの本がおおくて実際のソースコードで実感できるものを見たことが 無いので。。。
168 名前:デフォルトの名無しさん mailto:sage [2006/04/26(水) 23:47:32 ] >>165 Mapでも取得可能。DOMのElementに値を詰めて返すことも出来る
169 名前:デフォルトの名無しさん mailto:sage [2006/04/27(木) 00:02:01 ] ドメインモデルって難しい言葉を意識するから難しく感じるんであって、 要するにあれって「ただのまっとうなオブジェクト」ってことなんじゃないの? 「USERテーブルの行をロードしたデータ」じゃなくて、「ユーザー」という 「もの」を表したオブジェクトって考えようよ、というのがドメインモデルの ベースにあるところじゃないかと。 オブジェクトだと考えたら、「ユーザーの登録を抹消する」なら「じゃあ unregisterメソッドを読んだら抹消するってことで」と自然に思うじゃん。 裏でどんなSQL投げようが、ファイル読もうがセッションをごにょごにょ しようが、抹消してくれればしったこっちゃないでしょう。それがオブジェ クト指向ってもんだ。 DBを前提に考えちゃうと「ユーザを抹消するってことは、まず関連付けられた 契約レコードをすべて抹消したあと、ステータスをごにょごぎょして、 ユーザーのレコードの削除フラグをオン。それを効率良くするには、関連 レコードをジョインして....」とか考えてしまって、それをそのままべたっと コードに書いてしまいがち。 オブジェクト指向的には、ユーザーというオブジェクトの「抹消」という 命令を呼び出したら勝手にごにょごにょして抹消してくれりゃいいわけ で、その抹消メソッドが裏で勝手に契約レコードを抹消してステータス 変更してくれりゃいいじゃん、それがオブジェクトってもんだろ? 契約だってオブジェクトなんだから、ユーザーオブジェクトの抹消メソッド のなかで、契約オブジェクトの契約解除メソッドよべばいいじゃん。 ってのがドメインモデルじゃないかな。 ↓さあ景気良くいこう
170 名前:デフォルトの名無しさん [2006/04/27(木) 00:16:08 ] > ドメインモデルって難しい言葉を意識するから難しく感じるんであって、 > 要するにあれって「ただのまっとうなオブジェクト」ってことなんじゃないの? おそらくそういうことなんだろうな〜とは思ってるんですが、「サービス」とか いうやつの位置付けがようわからんです。なんでも人によると「薄いのが良い」 とかいう意見を見受けますが”じゃなんなんだい!”みたいな
171 名前:デフォルトの名無しさん mailto:sage [2006/04/27(木) 00:44:03 ] おれはサービス層については、下のような用途かなあと思う。 ・業務的には複数のモデルにまたがった業務処理を一括して行うためにある。 例:発送処理 おそらく「商品」と「発送業者」と「在庫」くらいの複数のモデルが 関わる予感がする。 ・プログラム的視点では、トランザクション境界を定めるためにある。 サービス層の一つのメソッド呼び出しが1トランザクションになるようにする、 という感じで。いろんなモデルをごにょごにょした結果、裏でいろんなSQLが 走るわけだけど、それを一つのトランザクションにまとめる、という感じだろうか。
172 名前:デフォルトの名無しさん [2006/04/27(木) 00:58:31 ] > ・業務的には複数のモデルにまたがった業務処理を一括して行うためにある。 > 例:発送処理 おそらく「商品」と「発送業者」と「在庫」くらいの複数のモデルが > 関わる予感がする。 EntityやDAOの呼び出しロジックをサービスにまとめるってことで総括して良いん でしょうか。もっとシンプルに言うなら、ビジネスロジックの担当がサービスなん だっていうことなんでしょうか。
173 名前:デフォルトの名無しさん mailto:sage [2006/04/27(木) 01:12:01 ] データベースアプリを組むときには、ほとんどドメインモデルは必要ない。
174 名前:デフォルトの名無しさん mailto:sage [2006/04/27(木) 03:01:05 ] データベースアプリというのが何を指しているのかよくわからないが、 データベースを使ったアプリという意味なら、データベースを使ったアプリで ドメインモデルを使わなけりゃいつ使うのかと。
175 名前:デフォルトの名無しさん mailto:sage [2006/04/27(木) 03:23:22 ] >>172 1行目はそうだと思う。 2行目は微妙。たとえば売り上げオブジェクトの「未回収」メソッドを呼んだら 赤伝オブジェクトが生成されて、台帳オブジェクトに追加されるとしたら、 これは立派なビジネスロジックなわけだが、この処理を書くところはあくまで 「売上」オブジェクトであるべきだよな。 だって「未回収」メソッド呼んだら裏でごにょごにょやる内容が赤伝生成だったり 台帳更新だったりするわけで。 仮に台帳更新をしたらどっかの担当者にメールを送らないといけないとしても、 台帳の更新メソッドが呼ばれたら、メーラーオブジェクトの送信メソッド呼ぶように してりゃいいわけで、結局外からみれば、売上の「未回収」を呼ぶだけで台帳に 赤伝が入って担当者にメールが飛ぶ、というビジネスロジックが実行される。 だったらロジック実行には売上オブジェクトだけあればOKだよな? こんな感じで結構な数のビジネスロックはドメインモデル内で実行可能だと思う。 でも処理実行後に、たとえば現在の赤伝数とか、赤伝発行後の売上高だとか を取得して画面に返さないといけないとしたら、これはあくまでウェブアプリ ケーションの都合で実行するんであって、ビジネスロジックとは関係ない。 でも同じトランザクション内で赤伝数のカウントしたり、売上高計算したり しないといけなかったりもする。 となると、サービスとして一つのトランザクション境界としてまとめるのが 一番やりやすいかなあ、と思うな。 まあでもぶっちゃけて言うと、Springとか使うとメソッド呼び出しと応答までを トランザクション境界にする機能があって便利なんで、それを利用するためだ けにサービス用意して、サービスを呼び出したら即モデルのメソッド一つ呼んで 終わり、なんてこともある。だってプログラム的にトランザクション制御する必要な くて楽だからさあ。