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

标签 spring hibernate database-connection

我花了几天时间尝试为我的 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>

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

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 应用程序上下文中定义一个 Hibernate-JPA 供应商适配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9684197/

相关文章:

service - PostgreSQL 9.2.4 (Windows 7) - 服务无法启动, "could not load pg_hba.conf"

mysql - 如何找出使用 Node js 连接 Mysql 失败的原因

java - 列类型的奇怪 Hibernate 异常

java - 使用 Java 配置的 Spring Hibernate JPA - 抽象方法错误

android - 将 Android 房间数据库与 Firebase 实时数据库关联起来

java - 将自定义 AuthenticationProcessingFilter 与 <form-login> 结合使用(自动配置 ="true")

java - Spring Boot+Hibernate关系问题

java - 带有 Spring Boot REST 应用程序的 OAuth2 - 无法使用 token 访问资源

java - "non-web"Spring 应用程序中的 Hibernate LazyInitializationExceptioin

java - 如何从文件 (populate.sql) 填充 H2 内存数据库?