【问题标题】:When using HSQLDB in-memory database, Hibernate/JPA EntityManager does not take parameter for HSQL script使用 HSQLDB 内存数据库时,Hibernate/JPA EntityManager 不接受 HSQL 脚本的参数
【发布时间】:2013-02-22 01:45:17
【问题描述】:

以下代码适用于 MySQL

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

Query 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 中间接引用的。

非常感谢任何帮助!

【问题讨论】:

  • 为什么不试试更新版本的 HSQLDB,比如 2.2.9。

标签: hibernate jpa hsqldb in-memory-database


【解决方案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 链接:

Function not supported from hibernate

谢谢。

【讨论】:

  • 如果你想避免persistence.xml,你可以使用Java配置一个LocalContainerEntityManagerFactoryBean来扫描你的实体类所在的包:bean.setPersistenceUnitName("my_unit"); bean.setPackagesToScan("my.entity");
猜你喜欢
  • 2011-04-17
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多