2013-09-06 19 views
9

例:JPAプロバイダ春のコンフィギュレーション・ファイルの

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory"ref="entityManagerFactory"/> 
    <property name="jpaDialect"ref="jpaDialect"/> 
</bean> 

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
.... 
</bean> 

とのpersistence.xml JPAファイル:

<persistence-unit name="EmployeeService"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
</persistence-unit> 

あなたはJPAを見ることができるようにプロバイダ関連の情報が3回設定されます。トランザクションマネージャBeanでは、エンティティマネージャファクトリBeanと永続ユニット構成で:

<property name="jpaDialect"ref="jpaDialect"/> 
... 
<property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
</property> 
... 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 

しかし、実際に私のプロジェクトで私は、プロバイダでのみ永続ユニットを構成しました。そしてそれは働いた。

私の質問はプロバイダ、ダイアレクト、ベンダーのオプションの違いは何ですか? すべてを設定する必要がありますか、その一部をスキップできますか? たとえば、EntityMangerFactory-Hibernateのベンダーとして、トランザクションマネージャーのEclipseの方言としても、永続性ユニットのコンフィグレーションのプロバイダとしても、TopLinkなどを設定することはできますか?

私には分かりません。説明してください。

答えて

11

行ずつあなたにそれを説明しようとします:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 

//Should ideally be 
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 
  • このBeanは、使用しようとしているjpaDialect定義します。 JpaDialectは、基本となるJDBC接続へのアクセスなど、標準のJPA 1.0が提供していない特定の機能をカプセル化したインタフェースです。この戦略は、主にJPAプロバイダのスタンドアロン使用を目的としています。その機能の大部分は、JTAトランザクションを使用して実行する場合は関係ありません。 Springによって提供される移植性があり、より優れたEntityManagerおよびEntityManagerFactoryサブインタフェースのための付加価値メソッドの提供も可能にします。
  • あなたはclass="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>としてクラスを提供してきたので、これはSpringは、SpringのEntityManagerFactoryクリエイターにベンダー固有の動作をプラグインすることができますし、それは春の独自のJpaVendorAdapterのすべてのベンダー固有properties.Itのカスタム実装のための単一の構成ポイントとして機能します。

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
        <property name="entityManagerFactory"ref="entityManagerFactory"/> 
        <property name="jpaDialect"ref="jpaDialect"/> 
    </bean> 
    
    • をあなたはその特性がentityManagerFactoryjpaDialectあるtransactionManagerを設定するには、 '春' を教えて:あなたが宣言した二Beanの場合

    。これらの特性はhibernateに固有でなければならないので、これらは設定されています。 entityManagerFactoryjpaDialectは、具体的にはhibernate(またはベンダー)に設定されています。第三の豆として

<property name="jpaDialect"ref="jpaDialect"/> 
... 
<property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
</property> 
... 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 

<provider>hibernateプロバイダを使用するスプリングを指示し、クラスorg.hibernate.ejb.HibernatePersistenceは、Hibernate EJB3永続プロバイダの実装です。

要するに、どのORMの機能を使用するかをSpringに指示するために、これらを設定する必要があります。

アプリケーションが永続性とプロバイダだけを構成する理由は、ベンダーアダプタがのgetPersistenceProviderを介して提供された永続性、つまりHibernatePersistenceを自動的に渡すためです。

これらのクラスがどのように相互リンクされているかを理解するために、ドキュメントをちらっと見てください。

EDIT

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 

ありがとう:@TheKojuEffectにより指摘したように、最初の豆は、理想的の形でなければなりません。 vendorAdapterが見つかりませんでした。あなたが参照できる

はそれがお役に立てば幸いです。 :)

+0

良い説明ですが、私はあなたの答えが間違っていると思います。最初のbean 'jpaDialect'では' jpaVendorAdapter'を意味すると思います。あなたの答えを訂正する方が良いでしょう。 – TheKojuEffect

+0

返事をありがとう。私はHibernateJpaVendorAdapterを見て、getJpaDialect()メソッドとgetPersistenceProvider()メソッドを見つけました。私はHibernateJpaVendorAdapterだけでエンティティマネージャファクトリを設定するのが正しいと思います。そして、アダプタクラスからjpa dialectとjpaプロバイダの両方を受け取るのに十分な理由があります。 – Alexandr

関連する問題