当前位置: 首页 > 知识库问答 >
问题:

JPA提供者与Spring contaniner配置中的方言与供应商

李勇
2023-03-14

Spring配置文件示例:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

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

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
....
</bean>

和persistence.xml jpa文件:

<persistence-unit name="EmployeeService">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
</persistence-unit>

如您所见,jpa提供者相关信息设置了3次。在事务管理器bean、实体管理器工厂bean和持久性单元配置中:

<property name="jpaDialect"ref="jpaDialect"/>
...
<property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
...
<provider>org.hibernate.ejb.HibernatePersistence</provider>

但实际上在我的项目中,我只配置了带有提供者的持久性单元。它起作用了。

所以我的问题是提供商、方言和供应商选项之间有什么区别?我必须全部设置吗?或者,我可以跳过其中一些?例如,我是否可以设置为EntityMangerFactory - Hibernate的供应商、事务管理器- Eclipse中的方言以及持久性单元配置中的提供者——比如TopLink。

我不清楚。请解释一下。

共有1个答案

裴俊能
2023-03-14

将尝试逐行向您解释:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

//Should ideally be 
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
  • 此 bean 定义了您将要使用的 jpaDialect。JpaDialect 是一个封装了标准 JPA 1.0 不提供的某些功能的接口,例如对底层 JDBC 连接的访问。此策略主要用于 JPA 提供程序的独立使用;在使用 JTA 事务运行时,它的大部分功能都无关紧要。还允许为Spring提供的可移植但功能更强大的EntityManager和EntityManagerFactory子接口提供增值方法。
  • 由于您已经将类作为class=“org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter”/

对于您声明的第二个 bean:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"ref="entityManagerFactory"/>
    <property name="jpaDialect"ref="jpaDialect"/>
</bean>
  • 你告诉'Spring'配置一个事务管理器,其属性是entityManagerFactoryjpaDialect。由于这些属性必须特定于Hibernate,因此根据这些属性进行设置。entityManagerFactoryjpaDialect 现在专门设置为Hibernate(或供应商)。

至于第三颗豆子

<property name="jpaDialect"ref="jpaDialect"/>
...
<property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
...
<provider>org.hibernate.ejb.HibernatePersistence</provider>

简而言之,您需要配置这些,以便告诉spring应该使用哪个ORM功能。

您的应用程序只配置持久性和提供程序的原因是,供应商适配器通过JpaVendorAdapter中的getPersistenceProvider自动传递提供的持久性,即Hibernate持久性

修改文档以理解这些类是如何相互联系的。

编辑:正如@TheKojuEffect所指出的,第一个bean的理想形式应该是:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>

谢谢。错过了供应商适配器

您可以参考:

  • Hibernate Jpa方言
  • Hibernate VendorAdapter
  • Hibernate持久性

希望对您有所帮助。:)

 类似资料:
  • 问题内容: 弹簧配置文件示例: 和persistence.xml jpa文件: 如您所见,与jpa提供程序相关的信息已设置3次。在事务管理器bean,实体管理器工厂bean和持久性单元配置中: 但是实际上在我的项目中,我仅使用提供程序配置了持久性单元。而且有效。 所以我的问题是提供商,方言和卖方选项之间有什么区别?我必须全部设置它们,还是可以跳过其中一些?例如,我可以设置为EntityManger

  • 问题内容: 我正在用硒编写以下代码,并且显示以下错误,请让我知道问题出在哪里。 导入org.testng.annotations.DataProvider; 导入org.testng.annotations.Test; 错误: 失败:testData org.testng.internal.reflect.MethodMatcherException:数据提供者不匹配方法:testData([Pa

  • 问题内容: 有人可以向我解释差异吗? Provisioner-在docker中安装,运行,拉出容器中的一项工作。 提供程序-是运行VM的东西。即VBox运行ubuntu OS映像。 Docker如何成为提供者?它直接运行一些docker镜像吗?如果我在Windows上,必须有一些boot2docker的隐藏用法,对不对?我什么时候使用每个? 问题答案: Docker Provisioner帮助准备

  • 我正在尝试为drools会话配置JPA持久性(代码来自drools文档) > 我在pom.xml中添加了drools-persistence-jpa、Bitronix事务管理器和com.h2database依赖项 我在“src/META-INF”中的Eclipse项目中创建了一个META-INF文件夹作为Source-Folder。 [...]EntityManagerFactory emf=pe

  • 提供者(Provider) 是一个连接以太坊网络的抽象,用与查询以太坊网络状态或者发送更改状态的交易。 EtherscanProvider 和 InfuraProvider 提供连接公开的第三方节点服务提供商,无需自己运行任何以太坊节点。 JsonRpcProvider 和 IpcProvider 允许连接到我们控制或可以访问的以太坊节点(包括主网,测试网,权威证明(PoA)节点或Ganache)

  • 服务提供者是 laravel 框架的重要组成部分,承载着各种服务,自定义的应用以及所有 Laravel 的核心服务都是通过服务提供者启动。本文将会介绍服务提供者的源码分析,关于服务提供者的使用,请参考官方文档 :服务提供者。 服务提供者的注册 服务提供者的启动由类 IlluminateFoundationBootstrapRegisterProviders::class 负责,该类用于加载所有服务