- PR -

EntityBeanを使用したtableへのupdateについて

1
投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2003-04-26 17:45
こんにちわ。

今CMP EntityBean(EJB2.0)を使用しています。
そこでテーブルへのupdateがうまく行われない事象にあたっています。

以下のような単純なものを作りました。
※他コールバックメソッド、LocalHome,Localクラスは省略
SampleEJB.java
====
コード:
import javax.ejb.*;

public abstract class SampleEJB implements EntityBean {
    private EntityContext ctx;
    
    public abstract void setId(String id);
    public abstract void setValue(String value);
    public abstract String getId();
    public abstract String getValue();

    public SamplePK ejbCreate(String id, String value) throws CreateException {
        setId(id);
        setValue(value);
        return null;
    }
    
    public void ejbPostCreate(String id, String value) {
    }



SessionEJB.java
※問題メソッド部のみ
===
コード:
    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);
        }
    }




このような単純なものを用意し、テーブルへのupdateを行うと
処理事態は正常終了しますが、実際のテーブルの中身はupdate
されていない、という状態です。

EntityBeanによるupdateは基本的にsetXXXメソッドを呼び出せば
いいんだと考えていたんですが違うのでしょうか?

デバッグとしてsample.setValue(value)の直後に
sample.getValue()にて値を取ってみましたが、この時点で
値が古いものでした。

なぜsetXXXメソッドが有効にならないのでしょうか?

環境依存な話かもしれない、またはどんなささいな可能性
でも良いので気づいたことがあればご指摘よろしくお願いします。


環境
jdk:j2sdk1.4.1_01
appserver:weblogic7.0試用版
db:oracle8i
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2003-04-26 19:25
補足です。

全てのメソッドの箇所でログを取りました。

updateをコールした際のログは以下です。
コード:
SessionBean update() start
    SampleHome.findByPrimaryKey() call.
        setEntityContext() start
        setEntityContext() start
        ejbActivate() start
        ejbLoad() start
    Sample.setValue() call.
        ejbActivate() start
        ejbLoad() start
SessionBean update() end



なぜかejbStore()が呼び出されていませんでした。

これはなぜなのでしょうか?

weblogic依存の話になってきそうな予感もしているのですが。。

どなたか有識者の方がいらっしゃったらご指摘お願い致します。
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-01 11:58
(CMPEntityBeanのステータスループを見てもらったほうが正確だとは思いますが)
うる覚えですが、ejbStoreは毎回呼び出されるものではないはずです。
メモリ上にキャッシュされ、コンテナー判断でパッシベートするタイミングで
DBに書き出されると思います。
北斗のポン
会議室デビュー日: 2003/05/02
投稿数: 17
投稿日時: 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
投稿数: 17
投稿日時: 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);
----------------------------------------------------------------------

でした。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2003-05-03 13:11
引用:

北斗のポンさんの書き込み (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);
----------------------------------------------------------------------

でした。



北斗のポン様 こんにちわ。

EJB2.0ではLocalObjectがサポートされました。
いちいちシリアライズする必要はなくなったので
ただのキャストでOKになりました。

EntityBeanは全てLocalObjectとして扱っていますので
SessionBeanはそれらをただの参照として扱うことができる
ということです。


また、問題の方ですが、一応解決しました。
やはりweblogicの問題だったみたいで、特有の設定ファイル
にある設定値を付与してやることで解決しました。

デフォルトでは設定がONの状態でして、ONの状態では
ejbStoreをトランザクションが終わるタイミングで呼び出すそうです。

それをOFFにしてやることでejbStoreをただちに呼ぶ?みたいな
ことにできるそうです。

でもSessionBeanのメソッドコールが終わればトランザクション
は終わっているはずなのでejbStoreが呼ばれないのはなぜかなぁ
と思ったりもしているんですが、まだ何か勘違いしているかもです。

とりあえず更新系のテーブルには設定をOFFにすることでupdate
できるようになりました。
1

スキルアップ/キャリアアップ(JOB@IT)