2016-05-05 3 views
0

私はSpring Data JPAを学んでおり、そのために私はSimpleスタンドアロンアプリケーションを書いています。 > User.java Spring Data JPAは、基礎となるJPAプロバイダをどのようにピックアップ/識別しますか?

@Entity 
@Table(name="USER_DETAILS") 
public class User { 
    @Id 
    @Column(name="SSNID") 
    private int ssnID; 
    @Column(name="FULLNAME") 
    private String fullName; 
    @Column(name="CITY") 
    private String city; 
    // Getters and Setters omitted 
} 

リポジトリクラス - - > JPADBAccess.java

@Repository 
    public interface JPADBAccess extends CrudRepository<User, Integer> { 

    } 

リポジトリを使用する単純なサービスクラス

エンティティ・クラス - :ここでサンプルコードであります - > DBServices.java

@Service 
public class DBServices { 

    @Autowired(required=true) 
    private JPADBAccess jPADBAccess; // How does this work?? ---->(1) 

    public void saveUser(User user) { 

     User queriedUser = null; 
     jPADBAccess.save(user); 

    } 
} 

スプリング構成ファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<beans ... "> 

<context:annotation-config/> <!-- This enables the annotation's actions, else annotations don't do their work. --> 
<context:component-scan base-package="com.example.service"/> <!-- This is for component scan --> 

<jpa:repositories base-package="com.example.jpa"/> <!-- This enables support for Spring Data JPA. --> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true"/> 
      <property name="generateDdl" value="true"/> 
      </bean> 
     </property> 
</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.h2.Driver"/> 
     <property name="url" value="jdbc:h2:tcp://localhost:9092/~/test"/> 
     <property name="username" value="sa"/> 
     <property name="password" value=""/> 
</bean> 

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

のpersistence.xmlは次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> 
    <persistence-unit name="userPersistenceUnit" transaction-type="RESOURCE_LOCAL" > 
    <class>com.example.model.User</class> 
</persistence-unit> 

スタンドアロンのクラスは次のようになります。

public class MainApp { 
    public static void main(String s[]) { 
     DBServices dBServices = null; 
     User user = new User(); 
     user.setSsnID(1); 
     user.setCity("Blr"); 
     user.setFullName("Full name"); 
     ApplicationContext appContext = new ClassPathXmlApplicationContext("spring-config.xml"); 
     dBServices = (DBServices) appContext.getBean("DBServices"); 
     dBServices.saveUser(user); 
    } 
} 

今ではすべて正常に動作し、私はJPAプロバイダとしてHibernateを使用しています(単にクラスパスにjarファイルを置く)

は、私は、次の質問がある:

1)設定ファイルに定義されたBeanが存在しない場合にDBServiceが@AutowireによってJPADBAccessのインスタンスを取得しない方法。

@Autowired(required=true) 
    private JPADBAccess jPADBAccess; // How does this work?? ---->(1) 

2)どのようにコンフィギュレーション・ファイルのいずれかで休止状態の言及がないとき、春データJPAを使用するか、または基礎となるJPAプロバイダーが休止状態であることを推測していますか?

答えて

2

1)構成ファイルで定義されたBeanがない場合、DBServiceは@AutowireによってJPADBAccessのインスタンスを取得します。

これはSpring Data JPAの魔法です:リポジトリのインターフェースを見つけて、自動的にその実装を生成します。これはSpringアプリケーションのコンテキストに置かれます。 JPADBAccessをオートワイヤするクラスでは、Springは自動生成された実装を見つけます。

2)構成ファイルのいずれかにHibernateが記述されていない場合、Spring Data JPAは基本となるJPAプロバイダがHibernateを使用または推論する方法を教えてください。

しかし、entityManagerFactoryにはHibernateJpaVendorAdapterというBeanが指定されています。

+0

感謝を休止状態この行が表示されます。 #1の質問では、Springが実装をオンザフライで提供することに同意しましたが、@Autowireアノテーションを使用する以外に、他の方法でインジェクトする方法がありますか? – CuriousMind

+1

@CuriousMind Beanを挿入するには、 '@ Autowired'アノテーションを使う方法とX​​ML設定ファイルを使う方法があります。 – Jesper

+0

はい、それは私が持っている混乱です。 Beanの実装はSpringのオンザフライで提供されるので、どのようにしてSpringの設定ファイルに提供することができます。私のコメントが素朴に聞こえる場合は、私が理解していないことが原因である可能性があります。 – CuriousMind

1
<jpa:repositories base-package="com.example.jpa"/> 

その行はすべてのリポジトリをスキャンし、あなたがいずれかを記述する必要がいけないので、BeanはJPADBAccessは実装が作成されたスプリングデータのパワーをあなたによって作成されていると呼ばれるこのような場合には、あなたのための豆を作成しますコード行に追加され、アプリケーションコンテキストに追加されます。

プロバイダの選択は、クラスパスに応じています

を次のように、JPAは時々ファイルMETA-INF/services/javax.persistence.spi.PersistenceProviderがクラスパスで検索されているとして、プロバイダの名前があるだろうプロバイダを選択するためにいくつかのクラスを使用していますあなたのケースでは、あなたはHibernateJpaVendorAdapterを使用しているとclass codeにあなたは負荷がお返事をプロバイダとしてそんなに

Class<?> hibernatePersistenceProviderClass = cl.loadClass("org.hibernate.jpa.HibernatePersistenceProvider"); 
+0

お返事ありがとうございました。私は最初の部分を得た。クエスト#2のために私は完全に理解していませんでした。私のサンプルアプリケーションでは、META-INF /ディレクトリを作成してpersistency.xmlファイルを配置しましたが、そこにはjavax.persistence.spi.PersistenceProviderファイルはありませんでした。つまり、これはサービスプロバイダが 'jpaVendorAdapter'の設定によるものなのでしょうか? – CuriousMind

+1

はい、正しいです。ファイルを配置しないと、アダプタが起動したときに、永続性をロードする必要なく自動的に提供されます。そのプロバイダクラスは、休止状態のjarファイル内にあります。 – Koitoer

関連する問題