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