0

EJB 開発を始めたばかりなので、次の 3 つのプロジェクトで構成されるテスト システムを作成しました。

システム概要

実際には、HelloWorldBeanRemoteインターフェイスもEJBTestプロジェクトに存在します。ランタイム例外なしで他のプロジェクトからインポートする方法が見つかりませんでした。

これEJBTestInterfacesは、リモート インターフェイスのみを含む単純な Java プロジェクトです。EJBTestプログラムロジックが含まれています。HelloWorldBeanセッション Bean です。そのコンストラクターは、createdフィールドを現在の時刻に設定します。このsayHello()メソッドでは、注入された を使用して ID 0PersistenceManagerを取得しTestEntity(存在しない場合は作成し)、'hit` 変数をインクリメントして返します。

@PersistenceContext(name="manager1") 
private EntityManager em;

@Override
public String sayHello() {
    String info;
    if (em == null)
        info = "Entity Manager is null";
    else {
        TestEntity entity;
        try {
            entity = em.find(TestEntity.class, 0);
            entity.setHits(entity.getHits() + 1);
            em.merge(entity);
            info = "Hit entity " + entity.getHits() + " times.";
        } catch(Exception x) {
            entity = new TestEntity();
            em.persist(entity);
            info = "Never used entity bean before.";
        } 
    }
    return "Hello! I was created at " + created.toString() + "<br>" + info;
}

持続性ユニットは、persistence.xml で次のように定義されています。

<persistence>
   <persistence-unit name="manager1">
       <jta-data-source>java:jboss/datasources/AppointmentDS</jta-data-source>
       <jar-file>../EJBTest.jar</jar-file>
       <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
                  <!-- also tried value="validate" -->
       </properties>
   </persistence-unit>
</persistence>

これは、standalone.xml で定義された組み込みデータベースを使用します。

<datasource jndi-name="java:jboss/datasources/AppointmentDS" pool-name="AppointmentDS" enabled="true" use-java-context="true">
    <connection-url>jdbc:h2:file:[path to file]</connection-url>
    <driver>h2</driver>
    <security>
        <user-name>sa</user-name>
        <password>sa</password>
    </security>
</datasource>

サーブレットは基本的に次の戻り値を出力しますsayHello()

doGet(...) {
    //get initial context ...

    bean = (HelloWorldBeanRemote)initialContext.lookup(name);
    output.write(bean.sayHello());
}

ここで、Web ブラウザーを介してサーブレットを呼び出すと、予想どおりの出力が得られます。作成日と「エンティティ Bean を使用したことはありません」ページを更新すると、作成日は変わりませんが、ヒット数は増加します。この動作を変更せずに、サーブレット プロジェクトを再起動できます。ヒット数は着実に増加します。

ただし、EJB プロジェクトを再起動すると、すべてがゼロにリセットされます。これは作成日の予想される動作ですが、ヒット カウントはデータベースから読み取る必要があります。そうではありません。

指定したディレクトリに作成されたデータベース ファイルが表示され、データが含まれているように見えます (ファイルをテキスト エディターで開いただけです)。

私が行ったようにセッション Bean を使用することになっていますか? リクエスト後に Bean を閉じる必要があるかどうかはわかりません (トランザクションをコミットできるようにするため)。

EJB プロジェクトがデータベース ファイルから永続化されたデータを読み取れるようにするにはどうすればよいですか?

4

2 に答える 2

1

hibernate.hbm2ddl.auto値をcreate-droptovalidateまたは他の値 に変更する必要があります。create-dropSessionFactory が閉じられるとスキーマ全体が削除され、開くと再度作成されます。

于 2013-05-13T09:51:19.117 に答える
0

EJB プロジェクトを再起動すると、つまり最後の接続が失われたときに、H2 が DB をリセットする可能性があります。EJB プロジェクトを停止し、DB に接続して、期待されるデータがまだそこにあるかどうかを確認します。

于 2013-05-13T10:49:56.270 に答える