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

为什么我需要在Spring应用程序上下文中定义Hibernate-JPA供应商适配器?

应煌
2023-03-14
问题内容

我花了几天又几天尝试为我的Spring /
JPA(Hibernate)集成测试建立一个有效的数据库连接,对神秘的“找不到数据库上下文”错误进行故障排除,但最终使它正常工作,但是我不明白为什么我必须这样做做我做的。

注意我的 LocalContainerEntityManagerFacotryBean 如何引用 HibernateJpaVendorAdapter

applicationContext.xml

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="myEMF">
    <property name="persistenceXmlLocation" value="file:src/test/resources/META-INF/persistence.xml" />
    <property name="persistenceUnitName" value="myPU" />
    <property name="jpaVendorAdapter" ref="hibernateJpaAdapter" />
</bean>

<bean id="hibernateJpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="showSql" value="true" />
</bean>

为什么我用这个 HibernateJpaVendorAdapter 时,我的持久性单元已经配置了对Hibernate如下图所示?

persistence.xml

<persistence-unit name="myPU" transaction-type="RESOURCE_LOCAL">
    <class>com.blah.blah.Class1</class>
    <class>com.blah.blah.Class2</class>
    <class>com.blah.blah.Class3</class> 
    <properties>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1?zeroDateTimeBehavior=convertToNull"/>
        <property name="hibernate.connection.username" value="uname"/>
        <property name="hibernate.connection.password" value="pwd"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />

        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.ejb.event.post-insert"
        value="org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-update"
        value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-delete"
        value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.pre-collection-update"
        value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.pre-collection-remove"
        value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-collection-recreate"
        value="org.hibernate.envers.event.AuditEventListener" />
        </properties>
</persistence-unit>

似乎可行,但是我这样做正确吗?我可以做另一种/更好的方法吗?


问题答案:

我刚刚在coderanch.com上的帖子中找到了我问题的答案。

如果仅在persistence.xml中的持久性单元定义中指定JPA提供程序,就可以绕开JpaVendorAdapter的使用,如下所示:

<persistence-unit name="myPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
            .
            .
            .


 类似资料:
  • 我试着去理解Spring是怎么跟所有的事情联系在一起的。然而,我不明白为什么在单元测试spring代码时使用mockito?spring不能处理与mockito相同的DI吗?莫基托贡献了什么是纯泉所不可能做到的? 澄清:我的想法是,我可以使用一个不同的应用程序上下文来进行测试,在这里创建我需要的存根bean作为虚拟对象。

  • 所以我写了一个小应用程序,为了熟悉基础知识,我使它尽可能简单。我用Config.java文件做了一个简单的mvc应用程序,当我认为现在应用程序应该抛出一个错误时,它实际上是有效的。 这是我的pom.xml 我的配置文件只有一个视图解析器: 主文件 最后是控制器类:package com。实例演示。控制器; 一个pplication.properties 这就是整个应用程序,我记得我需要。xml或使

  • 问题内容: 您可以在不使用元素的情况下在Spring application-context.xml文件中创建列表吗? 我有一个其构造函数带有对象的bean,并且我想通过“ value”属性传递整个列表。原因是此值来自.properties文件,您无法在.properties文件中定义列表。 我想做这样的事情…可能吗? MyClass.java: application-context.xml:

  • 问题内容: 该单页应用(SPA)已经到了我们。随之而来的还有很多新功能,例如路由,客户端页面生命周期,MVC模式,MVVM模式,MV *模式等等。还有一些Javascript模式,例如AMD模式,Singleton,Facade,.. 还开发了许多SPA框架和库。我们可以在互联网上找到它的一些内容。它们是AngularJs,Reactjs,BackboneJs,DurandalJs 等等,以及许多

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

  • 问题内容: 我正在尝试了解如何在Spring应用程序中使用JBoss EAP6。我有一个示例OpenShift应用程序,它包含一个文件。 我找到了有关此文件的一些文档,但是我不清楚为什么以及何时应该在Spring应用程序中使用这些文件。内容如下: 为什么需要声明对模块的依赖关系?JBoss范例中的模块是什么?没有这个xml文件是否可以生存? 问题答案: 只要您的应用程序没有任何类加载问题,就不需要