11

スプリング構成ファイルの例:

<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 など) として設定できますか。

それは私には明らかではありません。説明してください。

4

1 に答える 1

13

行ごとに説明しようとします:

<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クリエーターにプラグインすることができ、すべてのベンダー固有のプロパティの単一の構成ポイントとして機能します。これは、Spring 独自の のカスタム実装ですJpaVendorAdapter

宣言した 2 番目の Bean の場合:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"ref="entityManagerFactory"/>
    <property name="jpaDialect"ref="jpaDialect"/>
</bean>
  • transactionManagerプロパティがentityManagerFactoryおよびであるを構成するように「Spring」に指示しますjpaDialect。これらのプロパティはこれらに固有のものである必要があるためhibernate、それに応じて設定されます。entityManagerFactoryとは(またはベンダー)jpaDialectに明確に設定されるようになりました。hibernate

3つ目の豆は

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

プロバイダーを使用するようにSpring<provider>に指示hibernateし、クラスorg.hibernate.ejb.HibernatePersistenceはHibernate EJB3永続プロバイダー実装です。

つまり、どの ORM の機能を使用する必要があるかを Spring に伝えるために、これらを構成する必要があります。

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

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

編集: @TheKojuEffect で指摘されているように、最初の Bean は理想的には次の形式である必要があります。

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

ありがとう。を逃したvendorAdapter

参照できます:

それが役に立てば幸い。:)

于 2013-09-06T05:45:17.440 に答える