- PR -

xdocletでの主キーの定義について

1
投稿者投稿内容
なべぞう
ベテラン
会議室デビュー日: 2003/07/07
投稿数: 98
お住まい・勤務地: 岡山県
投稿日時: 2003-07-07 16:00
こんにちは、xdocletについて質問があります、わかるかた
アドバイスをお願いします。

いま主キーとなる列が二つあるエンティティBeanを作成して
います。この場合のxdocletのタグの記述方法がわかりませ
ん。いろいろ試しましたがどれもうまくいきません。

以下に試した方法と結果を記述します。
(1)単純に二行記述する
/**
* @ejb.bean
* type="CMP"
* name="ReceptionState"
* primkey-field="dateIn"
* primkey-field="receptionNumber"
* ----以下 省略----
結果→ejb-jar.xmlにreceptionNumberのみが主キーとして定義された。


(2)2つの文字列に分け、カンマで区切ってみる
/**
* @ejb.bean
* type="CMP"
* name="ReceptionState"
* primkey-field="dateIn" , "receptionNumber"
* ----以下 省略----
結果→ejb-jar.xmlにdateInのみが主キーとして定義された。


(3)2つの文字列に分け、空白で区切ってみる
/**
* @ejb.bean
* type="CMP"
* name="ReceptionState"
* primkey-field="dateIn" "receptionNumber"
* ----以下 省略----
結果→ejb-jar.xmlにdateInのみが主キーとして定義された。


(4)1つの文字列にまとめ、カンマで区切ってみる
/**
* @ejb.bean
* type="CMP"
* name="ReceptionState"
* primkey-field="dateIn,receptionNumber"
* ----以下 省略----
結果→以下のエラーが発生しビルドに失敗した。
Could not find method getDateIn,receptionNumber that is supposed to
return the PrimKeyField.


(5)1つの文字列にまとめ、空白で区切ってみる
/**
* @ejb.bean
* type="CMP"
* name="ReceptionState"
* primkey-field="dateIn receptionNumber"
* ----以下 省略----
結果→以下のエラーが発生しビルドに失敗した。
Could not find method getDateIn,receptionNumber that is supposed to
return the PrimKeyField.


以上です、助言、参考になる情報などありましたらお願いします。
wadahiro
会議室デビュー日: 2003/07/08
投稿数: 2
投稿日時: 2003-07-08 23:24
こんにちは、なべぞうさん。

CMPで複合キーを実現するには、独自のプライマリキークラスを作成する必要があると思います。
CMPでの複合キーについてはgoogleなどで調べてみてください。

で、XDocletで自動的に設定するには、プライマリキークラスの自動生成を行えばよろしいかと。
詳しくはXDocletのサイトを見てみてください。自動生成するためのタグ、タスクが用意されています。

簡単に書きますが、クラスレベルに
@ejb.pk class = "sample.MyPK"

主キーにしたいフィールドのgetメソッドに、
@ejb.pk-field

を記述します。
あとはビルドファイルにタスク<entitypk/>を実行するように記述します。

これでプライマリキークラスとそれを主キーに設定したejb-jar.xmlが生成されます。
なべぞう
ベテラン
会議室デビュー日: 2003/07/07
投稿数: 98
お住まい・勤務地: 岡山県
投稿日時: 2003-07-09 14:41
レスありがとうございました、ひろゆきさん。
ひろゆきさんのアドバイスのおかげで、複合キーをもつCMPを作成できました。
動作確認としてレコードの作成、削除、検索を行いました。

このスレッドも200人近い人に参照して頂きました。今後、他の人に役立てて
貰えるよう情報を残しておこうと思います。

下記にひろゆきさんのアドバイスをもとに私が作成したソースを一部抜粋ですが記します。

<<クラスレベルでの記述>>
/**
* @ejb.bean
* type="CMP"
* name="ReceptionState"
* view-type="remote"
* @ejb.pk class="test.interfaces.ReceptionStatePK"
* @ejb.finder
* signature="Collection findAll()"
* transaction-type="NotSupported"
* @ejb.persistence
* table-name="ReceptionState"
* @jboss:remove-table remove="true"
*/


<<メソッドレベルでの記述>>
/**
* @ejb.interface-method
* @ejb.pk-field
* @ejb.persistence
* column-name="DateIn"
* sql-type="integer"
*/
public abstract Integer getDateIn();
/**
* @ejb.interface-method
*/
public abstract void setDateIn(Integer dateIn);


<<ビルドファイルの記述>>

<!-- PrimaryKeyクラスの生成 -->
<entitypk/>

<!-- CMPエンティティBean生成 -->
<entitycmp/>

<!-- Valueオブジェクト生成 -->
<valueobject/>

<!-- リモート/ホームインタフェース生成 -->
<remoteinterface/>
<homeinterface/>


<<クライアントの記述>>
/* PrimaryKeyクラスをNEWする */
ReceptionStatePK rStatePK = new ReceptionStatePK( new Integer(args[1]),args2] );
/* 指定された受付日,受付番号に対する既存のレコードを検索 */
ReceptionState rState = home.findByPrimaryKey(rStatePK);


以上です。
1

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