- - PR -
EntityBeanを使用したtableへのupdateについて
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-04-26 17:45
こんにちわ。
今CMP EntityBean(EJB2.0)を使用しています。 そこでテーブルへのupdateがうまく行われない事象にあたっています。 以下のような単純なものを作りました。 ※他コールバックメソッド、LocalHome,Localクラスは省略 SampleEJB.java ====
SessionEJB.java ※問題メソッド部のみ ===
このような単純なものを用意し、テーブルへのupdateを行うと 処理事態は正常終了しますが、実際のテーブルの中身はupdate されていない、という状態です。 EntityBeanによるupdateは基本的にsetXXXメソッドを呼び出せば いいんだと考えていたんですが違うのでしょうか? デバッグとしてsample.setValue(value)の直後に sample.getValue()にて値を取ってみましたが、この時点で 値が古いものでした。 なぜsetXXXメソッドが有効にならないのでしょうか? 環境依存な話かもしれない、またはどんなささいな可能性 でも良いので気づいたことがあればご指摘よろしくお願いします。 環境 jdk:j2sdk1.4.1_01 appserver:weblogic7.0試用版 db:oracle8i | ||||||||
|
投稿日時: 2003-04-26 19:25
補足です。
全てのメソッドの箇所でログを取りました。 updateをコールした際のログは以下です。
なぜかejbStore()が呼び出されていませんでした。 これはなぜなのでしょうか? weblogic依存の話になってきそうな予感もしているのですが。。 どなたか有識者の方がいらっしゃったらご指摘お願い致します。 | ||||||||
|
投稿日時: 2003-05-01 11:58
(CMPEntityBeanのステータスループを見てもらったほうが正確だとは思いますが)
うる覚えですが、ejbStoreは毎回呼び出されるものではないはずです。 メモリ上にキャッシュされ、コンテナー判断でパッシベートするタイミングで DBに書き出されると思います。 | ||||||||
|
投稿日時: 2003-05-02 14:46
はじめまして。今日書き込みデビューで、三回も書き込んでいるポンです。
えーっと、私はEJB1.1の人間なので軽く読み流してもらっても結構なのですが、 問題のところのソースでふと疑問に思ったことがあります。 本来なら解決策を書くべきなのですが逆に質問を投げかけて申し訳ないのですが ちょっと見てやってください。 > ※問題メソッド部のみ > === > コード: > ----------------------------------------------------------------------------> public void update(String id, String value) { > try { > if(home == null) { > InitialContext ic = new InitialContext(); > home = (SampleHome)ic.lookup( > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > "java:comp/env/ejb/SampleHome"); > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > } > > Sample sample = home.findByPrimaryKey(new SamplePK(id)); > sample.setValue(value); > } catch( Exception e ) { > throw new EJBException(e); > } > } > ---------------------------------------------------------------------------- 上記で下線をつけたところですが、1.1の世界では一度Object型の変数に格納したあと下記のようにしてEJBHomeを取得していたのですが -------------------------------------------------------------------------------- Context ic = new InitialContext(); Object obj = ic.lookup("java:comp/env/ejb/SampleHome"); home = (SampleHome)PortableRemoteObject( obj,[EJBHomeのパッケージを含めたフルネーム]); -------------------------------------------------------------------------------- EJB2.0ではこのような面倒なことはしなくてもよくなったのでしょうか? | ||||||||
|
投稿日時: 2003-05-02 14:50
あ、すみません、ソース書き間違えました。
---------------------------------------------------------------------- Context ic = new InitialContext(); Object obj = ic.lookup("java:comp/env/ejb/SampleHome"); home = (SampleHome)PortableRemoteObject( obj,[EJBHomeのパッケージを含めたフルネーム]); ---------------------------------------------------------------------- ↓ ---------------------------------------------------------------------- Context ic = new InitialContext(); Object obj = ic.lookup("java:comp/env/ejb/SampleHome"); home = (SampleHome)PortableRemoteObject.narrow( obj,[EJBHomeのパッケージを含めたフルネーム].class); ---------------------------------------------------------------------- でした。 | ||||||||
|
投稿日時: 2003-05-03 13:11
北斗のポン様 こんにちわ。 EJB2.0ではLocalObjectがサポートされました。 いちいちシリアライズする必要はなくなったので ただのキャストでOKになりました。 EntityBeanは全てLocalObjectとして扱っていますので SessionBeanはそれらをただの参照として扱うことができる ということです。 また、問題の方ですが、一応解決しました。 やはりweblogicの問題だったみたいで、特有の設定ファイル にある設定値を付与してやることで解決しました。 デフォルトでは設定がONの状態でして、ONの状態では ejbStoreをトランザクションが終わるタイミングで呼び出すそうです。 それをOFFにしてやることでejbStoreをただちに呼ぶ?みたいな ことにできるそうです。 でもSessionBeanのメソッドコールが終わればトランザクション は終わっているはずなのでejbStoreが呼ばれないのはなぜかなぁ と思ったりもしているんですが、まだ何か勘違いしているかもです。 とりあえず更新系のテーブルには設定をOFFにすることでupdate できるようになりました。 | ||||||||
1
