使用 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 数据库中失败的主要内容,如果未能解决你的问题,请参考以下文章
通过使用 MySQL 的 DataJpaTest 存储库测试,Hibernate 不会在 H2 DB 中将用户设置为自动增量