2

以下代码适用于MySQL

但是在切换HSQLDB 内存数据库(用于单元测试)时,相同的代码会失败,

查询 query = entityManager.createQuery("SELECT c FROM CartInvoiceEntity c WHERE c.invoiceId = :invoiceId");

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

带有以下错误消息:

org.hibernate.QueryParameterException:找不到命名参数 [invoiceId]

调试时检查查询对象,我发现查询对象有一个参数字段。使用 MySQL 时,此参数在其 HashMap 中包含“invoiceId”。但是当切换到 HSQLDB 时,这个 HashMap 是空的——这就是抛出异常的原因。问题是为什么使用 HSQLDB 时 HashMap 为空。

以下是相关的 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,它是从 hibernate-core 和 hibernate-entitymanager JAR 中间接引用的。

非常感谢任何帮助!

4

1 回答 1

0

刚刚找到根本原因。在进行单元测试时(不一定有或没有 HSQLDB 等内存数据库),不知何故,Spring 组件扫描机制不适用于 JPA 持久性设置。这会导致 Hibernate 在查找参数时失败。Hibernate 仅在知道实体类时才查找参数。

我的解决方法是直接将类条目(用于实体类)添加到 persistence.xml中(在创建 EntityManagerFactory 时不知道如何在org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean中执行此操作)。

<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 链接:

休眠不支持的功能

谢谢。

于 2013-03-08T02:41:45.503 回答