本記事は「MIGRATING TO SPRING 3.1 AND HIBERNATE 4.1」の翻訳です。
間違いの指摘は@makingまで。
Core-Spring courseの一環として、私たちは一緒に春とJPA / Hibernateを統合する方法を示すために使用するラボ·アプリケーションを持っています。 私達はちょうどSpring 3.1 / Hibernateの4.1にそれをアップグレードし、我々はいくつかのヒントを共有するべきだと考えています。
1) Mavenの依存関係
以下の設定例は、Maven(ただし、必要に応じて、用意にGradle用に変換できます)に基づいています。 POMの中で、SpringやHibernate(使用してるSpringコンポーネントに応じてより多くのSpringの依存関係を宣言する必要があります)の最新バージョンを指定する必要があります。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.1.1.RELEASE</version>
<!-- will come with all needed Spring dependencies such as spring-core and spring-beans-->
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.1.1.Final</version>
<!-- will come with Hibernate core-->
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1</version>
</dependency>
CGLIBへの依存関係は、必ずしも必要ではありません。このブログエントリの最後にそのことについての詳細があります。
2) HibernateのSpring設定
Springは、Hibernateのいくつかのバージョンのサポートを提供しますので、使用しているバージョンを明示的に指定する必要があります。
Hibernate4では
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
...
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
Hibernate3で動作させたい場合は、代わりに次の設定をしてください。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
...
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
(パッケージのパスは、Hibernate3またはHibernate4を使用するかどうかに応じて異なります)
Hibernateを使用する場合、マッピングを記述する2つの一般的な方法があります。XMLとアノテーションです。
SpringとHibernate3の連携では2種類のSessionFactoryBean
を設定できます。
XMLマッピングのみ設定できるLocalSessionFactoryBean
と、
XMLマッピングおよび/またはアノテーションベースのマッピングを設定できるAnnotationSessionFactoryBean
Spring 3.1とHibernate 4では単純になります。LocalSessionFactoryBean
と呼ばれるSessionFactoryBean
だけがあります。
これは、アノテーションベースのマッピングおよびXMLベースのマッピングの両方で動作します。
慎重にこれらの2つの手順に従っている場合は、すでにアプリケーションは動作していることでしょう。
3)CGLIBへの依存関係は必要か?
答えは"はい"である可能性が高いです。それはSpringがhood(訳注:slang?)の下でそれを必要とすることは一般的です。いくつかの例を挙げます。
- Javaによる設定(詳細はこちら)
- インターフェースを実装していないSpring Beanへの、トランザクション制御、セキュリティ、キャッシングなどの機能追加(詳細はこちら)
@Transactional
アノテーションがJUnitテスト·ケースで使用される場合(通常は、各テストケースの終了時にデータベースのトランザクションをロールバックさせるために行います。詳細はこちら)。
など
注:CGLIBメンテナンスされていないプロジェクトです。SpringはSpring 3.2の開始とともに(その詳細については、関連するJIRAの課題を参照してください)、代替としてJavassistに移行している可能性があります。ですからSpring 3.2からは、CGLIBの代わりにJavassistの依存関係を追加することができるはずです。
4) Javaの設定
SpringでのJavaの設定の使用は、XMLベースとアノテーションベースの設定に対する興味深い代替手段です。
それでは、SpringとHibernateを、Javaの設定によって動作させるにはどうしたらよいでしょうか? LocalSessionFactoryBuilder
と呼ばれる新しいクラスのおかげで、かなり容易になります。
@Bean
public SessionFactory sessionFactory() {
return new LocalSessionFactoryBuilder(dataSource())
.addAnnotatedClasses(Person.class, Account.class)
.buildSessionFactory();
}
LocalSessionFactoryBuilder
は、Hibernate自体の設定クラスのサブクラスであり、名前が示すように、Springの@Configuration
がついたクラス内で使用するために便利なビルダースタイルのAPIを提供しています。