2016-03-25 3 views
1

永続性ユニットを定義せずに、サービスクラスにentityManagerを挿入できます。persistence-unitを定義せずにentityManagerを挿入できます

これは私の設定です:私のサービスクラスで

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 
<jpa:repositories base-package="com.example"></jpa:repositories> 

@PersistenceContext 
private EntityManager entityManager; 

// THIS WORKS! 
final Session session = entityManager.unwrap(Session.class); 

、それが原因でJPAは次のとおりですリポジトリ?

+1

entityManagerFactoryは、entityManagerを作成し、指定されたデータソースを使用する必要があります。したがって、注入が機能します。 '' 'jpa:repositoies''は単に' 'Repository''を拡張してクラスを検索して登録するパッケージ(とサブパッケージ)をSpringに伝えます。 – dambros

答えて

0

スプリングORMパッケージのLocalContainerEntityManagerFactoryBeanクラスがこれを可能にします。 DefaultPersistenceUnitManagerクラスを使用してPersistenceUnitInfoのインスタンスを作成し、次にクラスのcreateContainerEntityManagerFactoryに提供することができます。 Hibernateはこのインタフェースを実装して、SpringがEntityMangerFactoryクラスのインスタンスを作成できるようにします。

DefaultPersistenceUnitManager classは、defaultという名前のpersistenceUnitを作成し、クラスパス上のクラスを通過するすべてのエンティティクラスを見つけます。 persistence.xmlから取得した同じ情報が、物理的なpersistence.xmlファイルを持たずに、このような別の方法で取り込まれています。

最後にSpringは、JPAプロバイダ固有のEntityManagerFactoryインスタンスを取得するように構成されたJpaVendorAdapterを使用します。

バネデータJPA固有の<jpa:repositories base-package="...." />または@EnableJpaRepositoriesは、@Repositoryで注釈付けされたすべてのBeanをスキャンして、動的なクエリおよびその他の機能を提供します。これは網羅的な説明ではありませんが、この「魔法」がどのように起こるかがわかります。

grepcodeで詳しく調べたり、情報源をダウンロードして詳細を調べることができます。

+0

Buntiの説明に感謝します。 – sophie

関連する問題