Topics
Enterprise Architecture
Spring 2.0でのJPA(Java Persistence API)の利用
Pages:
1,
2,
3,
4,
5,
6
ここまで、Spring 2.0とJPAを用いてデータアクセスオブジェクトがどう実装されるかを見てきたので、ここでは、DAOを用いて機能を果たすMedRecサービスオブジェクトをざっと見てみましょう。以下のサンプルコードでは、
PatientServiceImplクラスと、そのビジネスメソッドの1つである
processNewRegistrationメソッドを示します。
public class PatientServiceImpl
extends BaseService implements PatientService {
protected PatientDao patientDao;
public void setPatientDao(PatientDao patientDao) {
this.patientDao = patientDao;
}
public void processNewRegistration(Registration registration) {
try {
User user = registration.getUser();
Patient patient = registration.getPatient();
patient.setUser(user);
user.setStatus(MedRecConstants.USER_NEW);
patientDao.save(pPatient);
} catch (Exception ex) {
...
}
}
...
}
processNewRegistrationメソッドは、新規患者がMedRec Webインタフェースを使って自己登録する際に呼び出されます。これは、新規患者の登録情報を格納した
Registrationオブジェクトをパラメータとして受け取ります。
ProcessNewRegistrationメソッドはまず、
Registrationオブジェクトから
Patientと
Userを取得し、両者の関係を初期化します。
Userオブジェクトには、患者のユーザ名とパスワードの情報が格納されているほか、管理者による承認が必要な新規患者であるため、患者のステータスが
USER_NEWに設定されています。そのあと、Patient DAOが呼び出されて、この新規患者がデータベースに挿入されます。
MedRecサービスオブジェクトに対するSpringの宣言的トランザクションは、トランザクションがSpringによって開始されてから
processNewRegistrationの ようなビジネスメソッドが呼び出され、そのメソッドが完了したときにトランザクションがコミットされるように、コンフィグレーションされます。これによ り、アトミックにコミット可能な既存トランザクションの一部として、DAOが自らの処理を実行することが保証されます。また、
setPatientDaoメソッドにも注意してください。これは、DAOオブジェクトへの参照をサービスBeanに注入するためにSpringで用いられるメソッドです。
これまで、医療記録管理(MedRec)アプリケーションの今回のバージョンを構成するJavaコードの一部を見てきました。このセクションでは、SpringとKodoに必要な外部コンフィグレーションについて説明します。まず、Springから始めましょう。
SpringのApplicationContextは、一連のモジュール式XMLコンフィグレーションファイルを用いてコンフィグレーションされます。データアクセスオブジェクトのコンフィグレーションを記述したコンフィグレーションファイルは
applicationContext-orm.xmlで、MedRecのインストールディレクトリ下の
src\medrecEar\APP-INF\classesディレクトリにあります。以下に示すのは
applicationContext-orm.xmlに記述されているスタンザで、Patient DAOを宣言しているものです。
<bean id="patientDao"
class="com.bea.medrec.dao.orm.JpaPatientDao"
autowire="byType"/>
SpringのJPA DAOには、注入されるべき依存性が1つだけあります。それは、JPAの
EntityManagerFactoryです。
EntityManagerFactoryは、実際の永続化処理を実行するJPA
EntityManagerを生成するためにDAOで使用されます。ここでの関連付けは、Springのオートワイヤ機能を用いて行われます。
EntityManagerFactoryへの依存性がXMLに明示的に記述されていないのは、そのためです。オートワイヤ機能は、DAOの
EntityManagerFactoryプロパティ(すべてのMedRec DAOクラスの親クラスであるSpring
JpaDaoSupportクラスから継承される)のタイプに基づいて、DAOを
EntityManagerFactoryに自動的に関連付けます。
以下のコードは、
EntityManagerFactoryを生成するSpringファクトリBeanを宣言するスタンザを示します。ここでは取り上げているファクトリが2つあるので、ややこしいような印象を受けるかもしれませんが、覚えておいて欲しいのは、何らかのカスタムコードを実行して
EntityManagerFactoryを生成できる一定の水準の間接的手段を提供することだけがSpringファクトリBeanの目的であるということです。
EntityManagerFactoryは、DAOオブジェクトが知っている、あるいは注意を払う唯一のファクトリです。
<bean id="entityManagerFactory"
class="com.bea.medrec.utils.KodoEntityManagerFactoryBean">
<property name="jndiName">
<value>kodo-jpa</value>
</property>
</bean>
この記事の執筆時点では、WebLogic ServerはJPAとの標準的な統合をサポートしていないので、
EntityManagerFactoryはカスタムファクトリBeanを用いて生成されます。
EntityManagerFactoryは、JNDIでKodoリソースアダプタをルックアップする場所を知っている必要があります。この情報はSpringファクトリBeanのプロパティとしてコンフィグレーションされ、そのファクトリBeanから
EntityManagerFactoryに渡されます。なお、ファクトリBeanの任務は、
EntityManagerFactoryインスタンスを生成してSpringに返すことで、それにより、Springはその
EntityManagerFactoryをDAO Beanに注入できるようになります。エンティティマネージャファクトリのインスタンスを生成するファクトリBeanのコードは、以下のようなものです。
public class KodoEntityManagerFactoryBean
implements FactoryBean, InitializingBean {
private String jndiName = "kodo-jpa";
private EntityManagerFactory entityManagerFactory = null;
public void setJndiName(String jndiName) {
this.jndiName = jndiName;
}
public Object getObject() throws Exception {
return entityManagerFactory;
}
public Class getObjectType() {
return EntityManagerFactory.class;
}
public boolean isSingleton() {
return true;
}
public void afterPropertiesSet() throws Exception {
try {
entityManagerFactory =
KodoPersistence.createEntityManagerFactory(
jndiName, new InitialContext());
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
}
}
KodoEntityManagerFactoryBeanは、かなり直接的なSpringファクトリBeanです。実行時には、Springはまずデフォルトコンストラクタを呼び出して、このBeanのインスタンスを生成します。そのあと、Springは
setJndiName()メソッドを呼び出して、KodoリソースアダプタのJNDI名を設定します。すべてのプロパティがいったん注入されたら、Springは
afterPropertiesSet()を呼び出し、その結果、
EntityManagerFactoryインスタンスが生成されます。最後に、Springは
getObject()を呼び出して、DAOに注入される
EntityManagerFactoryを取得します。