首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我需要在Spring应用程序上下文中定义Hibernate-JPA供应商适配器?

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

Stack Overflow用户
提问于 2012-03-13 12:47:59
回答 2查看 38.3K关注 0票数 14

我花了好几天的时间试图为Spring/JPA(Hibernate)集成测试获得一个可工作的数据库连接,为神秘的“无数据库上下文发现”错误进行故障排除,最后我终于开始工作了,但我不明白我为什么要这么做。

注意我的LocalContainerEntityManagerFacotryBean如何引用HibernateJpaVendorAdapter。

applicationContext.xml

代码语言:javascript
复制
<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>

当我的持久性单元已经配置为Hibernate时,为什么我必须使用这个HibernateJpaVendorAdapter,如下所示?

persistence.xml

代码语言:javascript
复制
<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>

看起来很管用,但我做得对吗?我还能用另一种更好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-13 13:41:13

我刚刚在coderanch.com上的一篇文章中找到了我的问题的答案。

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

代码语言:javascript
复制
<persistence-unit name="myPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
            .
            .
            .
票数 17
EN

Stack Overflow用户

发布于 2012-03-13 13:06:53

首先,我不知道为什么要使用它,但我知道不是强制使用它的

从API文档中,

为所需的JPA提供程序指定JpaVendorAdapter实现(如果有的话)。这将初始化给定提供程序的适当默认值,例如持久性提供程序类和JpaDialect,除非在此FactoryBean中本地重写。

按照我的理解,它是我们指定hibernate配置的另一种方式。我没有使用它,也没有在Spring API文档上找到它。它不是强制性的,让它被初始化为默认的价值

在春季,jpaVendorAdapter在他们的JIRA中也提到了一些问题。还有一个问题是这里

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9684197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档