1

maven-spring-hibernate-mysql-tomcat 環境をセットアップしています。

@PersistenceContext アノテーションを使用してエンティティ マネージャーを挿入したいと考えています。これを行うには、persistence.xml ファイルを指す PersistenceAnnotationBeanPostProcessor をアプリケーション コンテキストで定義する必要があります。

この場合、私のアプリケーション コンテキストは多かれ少なかれ次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:task="http://www.springframework.org/schema/task" xmlns:ox="http://www.springframework.org/schema/oxm"
    xsi:schemaLocation="
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
   http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
   http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
   http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd
   http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-3.1.xsd">

    <!-- Root Context: defines shared resources visible to all other web components -->

    <!-- Context -->
    <context:component-scan base-package="com.yl.mypack" />

    <!-- AOP -->
    <aop:aspectj-autoproxy />

    <!-- Properties -->

    <context:property-placeholder
        location="classpath:db.connection.properties,applicationProperties.properties" />

    <!-- DB Connection Pool -->
    <bean id="dataSourceGlobal" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">

        <!-- Data Source -->
        <property name="driverClass" value="${driverClass}" />
        <property name="jdbcUrl" value="${jdbcUrl}" />
        <property name="user" value="${user}" />
        <property name="password" value="${password}" />

        <!-- C3P0 Connection pool properties -->
        <property name="minPoolSize" value="${c3p0.min_pool_size}" />
        <property name="maxPoolSize" value="${c3p0.max_pool_size}" />
        <property name="unreturnedConnectionTimeout" value="${c3p0.timeout}" />
        <property name="idleConnectionTestPeriod" value="${c3p0.idle_test_period}" />
        <property name="maxStatements" value="${c3p0.max_statements}" />
        <property name="automaticTestTable" value="${c3p0.automatic_test_table}" />
    </bean>

    <!-- JPA -->
    <!-- Creates a EntityManagerFactory for use with the Hibernate JPA provider -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
            <property name="persistenceUnitName" value="myPU" />
            <property name="dataSource" ref="dataSourceGlobal" />
    </bean>



    <!-- In order to enable EntityManager injection -->
    <bean id="persistenceAnnotation"
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
        <property name="persistenceUnits">
            <map>
                <entry key="myPU" value="classpath:META-INF/persistence.xml" />
            </map>
        </property>
    </bean>

    <!-- Transactions -->
    <tx:annotation-driven />

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

</beans>

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

<persistence-unit name="myPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.transaction.flush_before_completion"
            value="true" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
        <property name="hibernate.show_sql" value="true" />
    </properties>
</persistence-unit>

これで、 @PersistenceContext アノテーションを使用してエンティティマネージャーを注入できるはずだと思います。これはドキュメントから取得したリストです。JpaVendorAdapter に取り掛かる前に、私の最初の質問は、エンティティ マネージャーのファクトリ定義に関するものです。次のプロパティ:

        <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
        <property name="persistenceUnitName" value="myPU" />

これらはエンティティ マネージャ ファクトリから参照する必要がありますか? それは必須ですか?

私の2番目の質問は JpaVendorAdapter に関するもので、私の場合はHibernateJpaVendorAdapterです。

HibernateJpaVendorAdapter を使用する場合、persistence.xml ファイルは必要ですか? 一部のプロパティが重複しているため。さらに、PersistenceAnnotationBeanPostProcessor を定義して、persistence.xml ファイルを指す必要がありますか? これら 2 つ (PersistenceAnnotationBeanPostProcessor と HibernateJpaVendorAdapter) は一緒に使用できますか? 彼らは一緒に行くべきですか?JDNIスタイルの定義を避けていると仮定すると、ベストプラクティスは何ですか?

前もって感謝します

4

1 に答える 1

0

データ ソース Bean と HibernateJpaVendorAdapter の組み合わせにより、Spring 3.1 で persistence.xml を取り除くことができます。この記事をチェックしてください:

http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/

だから答え:

  1. それらは必須ではありません。
  2. いいえ、persistence.xml は必要ありません。
  3. PersistenceAnnotationBeanPostProcessor が何を使用するのか正確にはわかりません。

    <context:component-scan base-package="com.demo.dao" />
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="hibernate-resourceLocal"/>
    </bean>
    
    <tx:annotation-driven/>
    
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    

私の Spring アプリケーション コンテキスト xml は、このように単純に見えます。そしてそれは働いています。

ベスト プラクティスが何であるかはわかりませんが、サービスをセッション Bean として公開する必要がある場合に備えて、簡単に実行できるように、persistence.xml を保持します。

于 2012-09-18T04:43:18.347 に答える