【问题标题】:Configuring JPA in Spring application在 Spring 应用程序中配置 JPA
【发布时间】:2013-04-16 15:40:11
【问题描述】:

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

【问题讨论】:

  • 如果你想深入了解,你应该分享 spring 的配置。
  • @HimanshuBhardwaj 完成

标签: java spring jakarta-ee jpa


【解决方案1】:

使用 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 类。

希望这能回答您的疑问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多