使用 Hibernate 的存储过程在嵌入式 h2 数据库中失败

Posted

技术标签:

【中文标题】使用 Hibernate 的存储过程在嵌入式 h2 数据库中失败【英文标题】:Stored procedure with Hibernate fails in embedded h2 database 【发布时间】:2020-01-25 22:33:49 【问题描述】:

我正在将数据保存到 myRepository1 并能够通过物化视图查看节省的数据,我需要刷新它。

      myRepository1.save(myObject);
      myRepository2.refreshView();

myRepository2 有:

        @Modifying
        @Query(value = "BEGIN my_refresh_view(); END;", nativeQuery = true)
        void refreshView();

其中 my_refresh_view 是一个简单的存储过程。 这在现实世界(Oracle DB)中运行良好 - 但是,当我使用嵌入式 h2 数据库对上面的代码运行集成测试时,我得到:

BEGIN my_refresh_view(); END; [42000-200]
org.springframework.dao.InvalidDataAccessResourceUsageException could not prepare statement;
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)

看起来存储过程和 h2 不匹配。

任何想法如何使它工作,或者可能有解决方法?

【问题讨论】:

【参考方案1】:

Hibernate JPA(至少 5.0.0 和更低版本)不支持 H2Dialect 的存储过程。H2Dialect 继承了返回 StandardCallableStatementSupport.NO_REF_CURSOR_INSTANCE 的 Dialect.getCallableStatementSupport()。标准可调用语句支持无法正确处理 H2“out”参数,该参数是 Java 返回值而不是语句参数 check details here

【讨论】:

以上是关于使用 Hibernate 的存储过程在嵌入式 h2 数据库中失败的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式模式下的 h2 并发更新

将 Hibernate HQL 应用于 H2 时遇到困难

通过使用 MySQL 的 DataJpaTest 存储库测试,Hibernate 不会在 H2 DB 中将用户设置为自动增量

Hibernate Transaction Manager 不提交数据更改

休眠 + Apache Tomcat。嵌入式数据库相对路径

在没有DI框架的情况下注入存储库