0

我正在通过使用 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>
4

1 回答 1

0

使用 JPA 有不同风格的 Spring Configuration,一种需要 persistence.xml,另一种只需要 bean 声明(没有 persistence.xml)。

我将在您的场景中处理案例 2:

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

  1. 数据库连接详细信息。
  2. 被视为实体或包的 Java 类,在其中扫描实体。
  3. 其他供应商特定的设置,如 hibernate.show_sql 或类似的东西。

现在,如果 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 中

例如

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

由于您已经在 Spring bean 中进行了所有配置,因此不需要 persistence.xml

只需添加脚注:

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

希望这能回答您的疑问。

于 2013-04-17T04:04:26.407 回答