PersistenceAnnotationBeanPostProcessor与JpaVendorAdapter

时间:2012-08-11 13:38:39

标签: spring hibernate persistence

我正在建立一个maven-spring-hibernate-mysql-tomcat环境。

我想使用@PersistenceContext注释注入我的实体管理器。 据我所知,我应该在我的应用程序上下文中定义PersistenceAnnotationBeanPostProcessor,指向我的persistence.xml文件。

在这种情况下,我的应用程序上下文可能或多或少看起来像这样:

<?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注释注入我的实体管理器,在列表中这是我从documentation得到的。在我到达JpaVendorAdapter之前,我的第一个问题将引用实体经理工厂定义: 以下属性:

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

这些是否需要从实体经理工厂转介?这是必须的吗?

我的第二个问题是关于JpaVendorAdapter,以及我的案例HibernateJpaVendorAdapter

如果我使用HibernateJpaVendorAdapter,我还需要一个persistence.xml文件吗?由于某些属性是重叠的。而且,我还需要定义PersistenceAnnotationBeanPostProcessor,指向我的persistence.xml文件吗?这两个可以一起使用(PersistenceAnnotationBeanPostProcessor和HibernateJpaVendorAdapter)吗?他们应该一起去吗?什么是最佳实践,假设我避免任何JDNI样式定义?

提前致谢

1 个答案:

答案 0 :(得分: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>
    
  4. My Spring应用程序上下文xml看起来很简单。它正在发挥作用。

    我不是最佳做法,但我会保留persistence.xml,以便在我需要将我的服务作为会话bean公开时,可以轻松完成。