FaqJ2EEGeneratePKJa
主キー値の生成
この記事は、MySQL データベースの主キー値生成機能を使用する CMP ビーンの開発を記述します。この文書は MySQL の App Server 8.1 内の設定を記述することは意図していません。
背景
Sun Java System Application Server は、EBJ 1.1、2.0、2.1 CMP ビーンに対する自動主キー生成をサポートします。自動主キー生成を指定するには、ejb-jar-xml ファイル内の prim-key-class 要素に java.lang.Object 値を与えます。自動生成主キーを伴う CMP ビーンは他の CMP ビーンとの関係にも関与できます。Sun Java System Application Server は、データベース生成主キー値はサポートしません。
データベーススキーマが配備中に生成された場合、Sun Java System Application Server は主キー列を含むスキーマを生成し、実行時に主キー列用の一意値を生成します。
データベーススキーマが配備中に生成されない場合、マップされた表内の主キー列は19桁以上の精度を持つ NUMERIC 型で無ければならず、いかなる CMP フィールドにもマップしてはいけません。Sun Java System Application Server は、実行時に主キー列用の一意値を生成します。
データベースとアプリケーションサーバの設定
- 表の作成:
CREATE TABLE customer ( id BIGINT(19) NOT NULL auto_increment, -- this column will be automat. generated lastName varchar(25) NOT NULL, firstName varchar(30) default NULL, PRIMARY KEY (id))
- MySQL JDBC ドライバ (mysql-connector-java-xxxx.jar) を $SUN_APP/domains/domain1/lib/ext に複写
- サーバを再起動
EJB モジュールの作成
- 新規 EJB モジュール CustomerModule を作成します
- カスタム表から CMP ビーンを生成します
- id 行が CMP ビーンにマップされていない、プロジェクトタブで id を示すノードを選択し、削除アクションを実行します
- エディタでビーンクラスを開き、ejbCreate メソッドと ejbPost メソッドから id パラメータを削除します
- 作成メソッドの戻りパラメータを java.lang.Object に変更します
- CustomerLocalHome インタフェースを開き、作成メソッドから id パラメータを削除します
- findByPrimaryKey メソッドのパラメータ型を java.lan.Object に変更します
- 新規無状態セッションビーン CustomerFacade を遠隔インタフェースに追加します
- Call EJB を呼び出し、カスタマエンティティービーンを選択します
- これらのビジネスメソッドを実装し、遠隔インタフェースに追加します:
public long createCustomer(String lastName, String firstName) throws Exception { return ((Long)customerHome.create(lastName, firstName).getPrimaryKey()).longValue(); } public String getName(long id) throws Exception { CustomerLocal customer = customerHome.findByPrimaryKey(new Long(id)); return customer.getFirstName() + " " + customer.getLastName(); }
- 接続プールノードを選択し、DataSouce クラスの名前を次のように変えます: com.mysql.jdbc.jdbc2.optional.MysqlDataSource。IZ 参照。
- モジュールを配備します
CMP ビーンの検査
- プロジェクトタブの中でソースの下の CustomerFacadeBean を選択し、「ツール」->「JUnit テスト」->「テストを作成」を起動します
- すべての testxxx メソッドを削除します
- setUp と二つの検査メソッドを実装します
protected void setUp() throws Exception { InitialContext ctx = new InitialContext(); Object obj = ctx.lookup("ejb/CustomerFacadeBean"); customerFacade = ((CustomerFacadeRemoteHome)PortableRemoteObject.narrow(obj, CustomerFacadeRemoteHome.class)).create(); } public void testCreateCustomer() throws Exception { System.out.println("PK: " + customerFacade.createCustomer("Foo","Bar")); } public void testGetCustomerName() throws Exception { long id = customerFacade.createCustomer("Blaha", "Petr"); assertEquals("Petr Blaha",customerFacade.getName(id)); }
- appserv-rt.jar を Test クラスパスに追加します
- 検査を実行し結果を調べます
課題
- 配備の際にエラーになりました JDO71030: There is no column in table myTable which can be used to support the servers implementation of unknown key classes.。この問題は、あなたのモジュールの誤った構成によって発生します。ejb-jar.xml、作成メソッドの戻り型、findByPrimaryKey のパラメタが、正しいことを確認してください。
---
- 英文 (翻訳したバージョン: 3)
- 日本語 NetBeans ユーザー FAQ へ戻る