При использовании базы данных HSQLDB в памяти Hibernate / JPA EntityManager не принимает параметр для сценария HSQL

Следующий код хорошо работает с MySQL.

Но тот же код не работает при переключении базы данных в памяти HSQLDB (для модульного теста),

Запрос query = entityManager.createQuery ("ВЫБРАТЬ c ИЗ CartInvoiceEntity c WHERE c.invoiceId =: invoiceId");

query.setParameter ("invoiceId", cartInvoiceEntity.getInvoiceId ());

со следующим сообщением об ошибке:

org.hibernate.QueryParameterException: не удалось найти именованный параметр [invoiceId]

Проверив объект запроса при отладке, я обнаружил, что у объекта запроса есть поле параметров. При использовании MySQL этот параметр содержит invoiceId в его HashMap. Но при переключении на HSQLDB эта HashMap пуста - поэтому возникает исключение. Вопрос в том, почему HashMap пуст при использовании HSQLDB.

Ниже приведены соответствующие зависимости Maven.

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.1.9.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.1.9.Final</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.16</version>
    </dependency>
    <dependency>
        <groupId>hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>1.8.0.10</version>
        <scope>test</scope>
    </dependency>

Из иерархии зависимостей я вижу, что используется hibernate-jpa-2.0.api: 1.0.1.Final, и на него косвенно ссылаются JAR-файлы как hibernate-core, так и hibernate-entitymanager.

Любая помощь высоко ценится!


person user2142271    schedule 07.03.2013    source источник
comment
Почему бы не попробовать более новую версию HSQLDB, например, 2.2.9.   -  person fredt    schedule 08.03.2013


Ответы (1)


Только что нашел первопричину. При выполнении модульного теста (не обязательно с базой данных в памяти или без нее, такой как HSQLDB) каким-то образом механизм сканирования компонентов Spring не работает должным образом для настройки сохраняемости JPA. Это вызывает сбой Hibernate при поиске параметра. Hibernate ищет параметр только в том случае, если ему известны классы сущностей.

Мое исправление - добавлять записи классов (для классов сущностей) в persistence.xml напрямую (не знаю, как это сделать в org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean при создании EntityManagerFactory).

<persistence-unit name="my_unit">
    ...
    <class>my.entity.CartInvoiceEntity</class>
    ...
</persistence-unit>

Видеть:

http://www.springbyexample.org/examples/one-to-many-jpa-hibernate-config-jpa-config.html http://www.aoiblog.com/wp-content/uploads/2010/02/two.jpg

Но я столкнулся с другой проблемой, которая связана с самим HSQLDB, как показано ниже.

Вызвано: org.hibernate.exception.GenericJDBCException: эта функция не поддерживается

Эта проблема была решена путем обновления версии HSQLDB. См. Следующую ссылку на stackoverflow:

Функция не поддерживается в спящем режиме

Спасибо.

person user2142271    schedule 08.03.2013
comment
Вы можете настроить LocalContainerEntityManagerFactoryBean с помощью Java для сканирования пакета, в котором находятся ваши классы сущностей, если вы хотите избежать файла persistence.xml: bean.setPersistenceUnitName (my_unit); bean.setPackagesToScan (my.entity); - person Mark Chorley; 04.04.2013