在Spring应用程序中配置JPA

时间:2013-04-16 15:40:11

标签: java spring java-ee jpa

我正在使用Hibernate实现将Spring配置为使用JPA。但是我完全不理解这个过程。我已经通过跟随不同的博客等工作了。我使用了EJB 3.1,并且我有一个persistence.xml。但是在春天我声明了一个LocalContainer ... Bean并为它提供了一些属性,而且我没有persistence.xml。有人可以解释它在Spring中是如何工作的以及声明的bean是什么?

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="packagesToScan" value="com.company.domain" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">
                org.hibernate.dialect.PostgreSQL82Dialect
            </prop>
        </props>
    </property>
</bean>

1 个答案:

答案 0 :(得分:0)

Spring配置有不同版本的JPA,一个需要persistence.xml,另一个需要bean声明(没有persistence.xml)。

我将在你的场景中讨论案例2:

我们想要一个persistence.xml的主要原因是由于以下原因:

  1. 数据库连接详情。
  2. 被视为要扫描实体的实体或包的Java类。
  3. 其他供应商特定的设置,如hibernate.show_sql或类似的东西。
  4. 现在,如果spring提供了一种在bean配置中一起提及所有这些内容的方法,那么就不需要拥有persistence.xml。

    如果是bean定义,请将其分解。

    <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="packagesToScan" value="com.company.domain" />
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.PostgreSQL82Dialect
                </prop>
            </props>
        </property>
    </bean>
    

    第一个属性,dataSource已包含数据库设置。

    第二个属性,jpaVendorAdapter是特定于Spring的属性

    第三个属性,packagesToScan这是Spring的一个属性来扫描实体,我们要么在persistence.xml中通过使用“class”标签来提及每个类FQN。

    第四个属性,顾名思义,jpaProperties可以在Spring中,也可以在persistence.xml中

    e.g。

    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL82Dialect" />
    

    由于您已经拥有Spring bean中的所有配置,因此无需使用persistence.xml

    只需添加FootNote:

    Spring 3.1提供了一个替代方案:LocalContainerEntityManagerFactoryBean,它接受'packagesToScan'属性,指定要扫描@Entity类的基础包。

    希望这可以回答您的问题。