首页 文章

使用HSQLDB内存数据库时,Hibernate / JPA EntityManager不接受HSQL脚本的参数

提问于
浏览
2

以下代码适用于 MySQL .

但切换 HSQLDB in-memory database (单元测试)时,相同的代码失败,

查询查询= entityManager.createQuery(“SELECT c FROM CartInvoiceEntity c WHERE c.invoiceId =:invoiceId”); query.setParameter(“invoiceId”,cartInvoiceEntity.getInvoiceId());

以下错误消息:

org.hibernate.QueryParameterException: could not locate named parameter [invoiceId]

在调试时检查查询对象,我发现查询对象有一个参数字段 . 使用MySQL时,此参数在其HashMap中包含“invoiceId” . 但是当切换到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被使用,它是从hibernate-core和hibernate-entitymanager JAR间接引用的 .

任何帮助都非常感谢!

1 回答

  • 0

    刚刚找到了根本原因 . 在进行单元测试时(不一定有或没有内存数据库,如HSQLDB),不知何故,Spring组件扫描机制对JPA持久性设置无法正常工作 . 这会导致Hibernate在查找参数时失败 . 如果Hibernate知道实体类,它只查找参数 .

    我的修复是直接 add class entries (for entity classes) into 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链接:

    hibernate不支持该功能

    谢谢 .

相关问题