Хранимая процедура с Hibernate завершается неудачно во встроенной базе данных h2 - PullRequest
0 голосов
/ 26 января 2020

Я сохраняю данные в myRepository1 и для того, чтобы увидеть экономию с помощью материализованного представления, мне нужно обновить sh it.

      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 Ответ

0 голосов
/ 26 января 2020

Hibernate JPA (по крайней мере 5.0.0 и ниже) не поддерживает хранимые процедуры для H2Dialect.H2Dialect наследует Dialect.getCallableStatementSupport (), который возвращает StandardCallableStatementSupport.NO_REF_CURSOR_INSTANCE. Поддержка стандартного вызываемого оператора неправильно обрабатывает параметр H2 "out", который является возвращаемым значением Java, а не параметром оператора проверьте подробности здесь

...