gpt4 book ai didi

spring - 如何在单元测试中使用内存中的 HSQLDB 序列?

转载 作者:行者123 更新时间:2023-12-01 23:33:54 24 4
gpt4 key购买 nike

我的应用程序使用序列,我正在尝试使用具有类似设置的 HSQLDB in-mem 数据库设置 junit 测试环境。这就是我配置序列及其创建的方式:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" lazy-init="true"
destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:test"/>
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<bean id="logSeqIncrementer" class="org.springframework.jdbc.support.incrementer.HsqlSequenceMaxValueIncrementer">
<property name="dataSource" ref="dataSource" />
<property name="incrementerName" value="public.agent_logs_seq" />
</bean>

<bean id="offerSeqIncrementer" class="org.springframework.jdbc.support.incrementer.HsqlSequenceMaxValueIncrementer">
<property name="dataSource" ref="dataSource" />
<property name="incrementerName" value="public.offers_seq" />
</bean>
<jdbc:embedded-database
id="test"
type="HSQL">
<jdbc:script
location="classpath:/create-ddl.sql" />
</jdbc:embedded-database>
</beans>

以及create-ddl.sql的内容:

CREATE SEQUENCE public.agent_logs_seq;

结果

java.sql.SQLException: Sequence already exists in statement

但是如果我把它注释掉,我就明白了

java.lang.AssertionError: Unexpected exception:
org.springframework.dao.DataAccessResourceFailureException:
Could not obtain sequence value; nested exception is
java.sql.SQLException: Sequence not found:
AGENT_LOGS_SEQ in statement [call next value for public.agent_logs_seq]

我尝试使用序列的方式:

DataFieldMaxValueIncrementer incrementer =
(DataFieldMaxValueIncrementer) context.getBean("logSeqIncrementer");
Integer logId = Integer.valueOf(incrementer.nextIntValue());

编辑:更改了上面的细节,以便使用正确的序列类。但是,它并没有解决问题。

最佳答案

您已将 org.springframework.jdbc.support.incrementer.HsqlMaxValueIncrementer 指定为类,但是,Spring 似乎正在使用 HsqlSequenceMaxValueIncrementer(在同一个包中)并且创建一个 SEQUENCE,而不是一个 TABLE。

HsqlMaxValueIncrementer 是一个较旧的实现,适用于不支持 SEQUENCE 对象的数据库平台。 HsqlSequenceMaxValueIncrementer 较新(Spring v. 2.5)并且是 HSQLDB 更高效的选择。这应该创建您指定的 SEQUENCE 对象,然后在内部使用 NEXT VALUE FOR public.agents_logs_seq 来检索下一个序列值。

关于spring - 如何在单元测试中使用内存中的 HSQLDB 序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12002753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com