当前位置: 首页 > 面试题库 >

Spring容器配置中的JPA提供程序与方言与供应商

彭正谊
2023-03-14
问题内容

弹簧配置文件示例:

<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。

我不清楚。请解释。


问题答案:

将尝试逐行向您解释:

<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子接口提供增值方法。
  • 由于您已经提供了类as class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>,因此可以Spring将特定于供应商的行为插入到Spring的EntityManagerFactory创建者中,并且可以用作所有特定于供应商的属性的单个配置点。这是spring自己的自定义实现JpaVendorAdapter

对于您声明的第二个bean:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"ref="entityManagerFactory"/>
    <property name="jpaDialect"ref="jpaDialect"/>
</bean>
  • 您告诉’Spring’配置transactionManager其属性为entityManagerFactory和的jpaDialect。由于这些属性必须特定于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>

<provider>告诉Spring使用hibernate提供者和类org.hibernate.ejb.HibernatePersistence是Hibernate的EJB3持久性提供者实现。

简而言之,您需要配置它们以告知spring应该使用哪个ORM功能。

您的应用程序只能配置持久性和提供程序的原因是因为供应商适配器会自动传递提供的持久性,即HibernatePersistence通过getPersistenceProviderin
JpaVendorAdapter

仔细阅读文档,以了解这些类如何相互链接。

编辑 :如@TheKojuEffect所指出的,理想情况下,第一个bean的形式应为:

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

谢谢。错过了vendorAdapter

您可以参考:

  • hibernateJpa方言
  • HibernateVendor适配器
  • HibernatePersistence

希望能帮助到你。:)



 类似资料:
  • Spring配置文件示例: 和persistence.xml jpa文件: 如您所见,jpa提供者相关信息设置了3次。在事务管理器bean、实体管理器工厂bean和持久性单元配置中: 但实际上在我的项目中,我只配置了带有提供者的持久性单元。它起作用了。 所以我的问题是提供商、方言和供应商选项之间有什么区别?我必须全部设置吗?或者,我可以跳过其中一些?例如,我是否可以设置为EntityMangerF

  • 问题内容: 有人可以向我解释差异吗? 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

  • 问题内容: 我正在做一个很大的项目,有很多注入。当前,我们正在使用一个类,该类为需要一次的每次注入实现,并且它们大多具有一个行方法。 每当我需要一个新的提供程序时,创建一个新的类就变得很烦人。使用提供程序类比使用方法有什么好处,反之亦然? 问题答案: 据我所知,它们在大多数简单情况下是完全等效的。 无论哪种样式,即使键绑定到类或实例,Guice都可以让您注入和。如果直接获取实例,Guice会自动调

  • 错误: 失败:testData org.testng.internal.reflect.MethodMatcherException:数据提供程序不匹配方法:testData([参数{index=0,Type=java.lang.String,DeclaredAnnotations=[]},参数{index=1,Type=java.lang.String,DeclaredAnnotations=[

  • 我有Spring Boot Web应用程序,最初是为内部Tomcat服务器构建的(有效)。然后我采用了该应用程序在Web Logic服务器上运行。我的应用程序编译并部署到服务器没有问题,但当它不服务MVC页面时。每次调用都会抛出404错误。从下面的错误看,它看起来像Spring调度程序servlet存在,但甚至区域设置都没有正确设置。我无法弄清楚这里有什么问题或缺失,但当我创建RestContro