Spring:HSQL-无法执行数据库脚本
Posted
技术标签:
【中文标题】Spring:HSQL-无法执行数据库脚本【英文标题】:Spring: HSQL- Failed to execute database script 【发布时间】:2013-08-30 21:42:04 【问题描述】:我正在尝试使用以下两个脚本运行 HSQL,然后对其进行测试,但每次我都遇到无法处理的错误。
执行数据库脚本失败;嵌套异常是 org.springframework.jdbc.datasource.init.ScriptStatementFailedException: 无法在资源类路径资源 [data.sql] 的第 4 行执行 SQL 脚本语句:插入到 spittle (spitter_id, spittleText,postedTime) 值 (2, '试用 Spring 的新表达语言。', '2010-06-11')
更新 - 已引发的其他异常:
完整性约束违规:外键无父; SYS_FK_10108 表:SPITTLE
这些是我的脚本:
schema.sql
drop table if exists spittle;
drop table if exists spitter;
create table spitter (
id identity,
username varchar(25) not null,
password varchar(25) not null,
fullname varchar(100) not null,
email varchar(50) not null,
update_by_email boolean not null
);
create table spittle (
id integer identity primary key,
spitter_id integer not null,
spittleText varchar(2000) not null,
postedTime date not null,
foreign key (spitter_id) references spitter(id)
);
数据.sql
insert into spitter (username, password, fullname, email, update_by_email) values ('habuma', 'password', 'Craig Walls', 'craig@habuma.com', false);
insert into spitter (username, password, fullname, email, update_by_email) values ('artnames', 'password', 'Art Names', 'artnames@habuma.com', false);
insert into spittle (spitter_id, spittleText, postedTime) values (1, 'Have you read Spring in Action 3? I hear it is awesome!', '2010-06-09');
insert into spittle (spitter_id, spittleText, postedTime) values (2, 'Trying out Spring''s new expression language.', '2010-06-11');
insert into spittle (spitter_id, spittleText, postedTime) values (1, 'Who''s going to SpringOne/2GX this year?', '2010-06-19');
appContext.xml
<?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:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:schema.sql" />
<jdbc:script location="classpath:data.sql" />
</jdbc:embedded-database>
</beans>
单元测试
package com.habuma.spitter.persistence;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
public class DataAccessUnitTestTemplate
private static EmbeddedDatabase db;
@Before
public void setUp()
// creates a HSQL in-memory db populated from default scripts classpath:schema.sql and classpath:test-data.sql
// obviously, this is the 'in-code' method, but the xml should work for Spring managed tests.
db = new EmbeddedDatabaseBuilder().addDefaultScripts().build();
@Test
public void testDataAccess()
JdbcSpitterDao jdbc = new JdbcSpitterDao(db);
System.out.println(jdbc.getSpitterById(1L));
@After
public void tearDown()
db.shutdown();
【问题讨论】:
@SotiriosDelimanolis 准备好的语句看起来像这样SQL_SELECT_SPITTER = "select id, username, fullname from spitter where id = ?"
。但是我测试了应用程序,它在setUp()
方法上失败了(也评论了其他)。
@SotiriosDelimanolis 你能说得更具体点吗?我不确定我应该删除什么。我更新了引发第二个异常的问题。
@SotiriosDelimanolis 这没有帮助。但我刚刚注意到,在输出的开头有 log4j:WARN No appenders could be found for logger (org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory). log4j:WARN Please initialize the log4j system properly.
这可能是我的问题的根源吗?
不,这无关紧要。
@SotiriosDelimanolis 似乎问题在于插入到spittle
表的行中的data.sql
。我在没有插入spittle
的情况下测试了相同的脚本,它可以工作。错误是java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: foreign key no parent; SYS_FK_10108 table: SPITTLE
。我不确定,但脚本真的有问题吗?
【参考方案1】:
您的脚本以 0 开始 ID 列值。您可以指定起始值。
create table spitter (
id int generated by default as identity (start with 1) primary key,
username varchar(25) not null,
password varchar(25) not null,
fullname varchar(100) not null,
email varchar(50) not null,
update_by_email boolean not null
);
或者,您可以显式插入 id:
insert into spitter (id, username, password, fullname, email, update_by_email) values (1, 'habuma', 'password', 'Craig Walls', 'craig@habuma.com', false);
【讨论】:
以上是关于Spring:HSQL-无法执行数据库脚本的主要内容,如果未能解决你的问题,请参考以下文章
使用 HSQL 和 Spring Script Utils 创建触发器或过程
连接 HSQL 数据库管理器时无法从 Java 代码连接到 HSQL 数据库
通过 CassandraPageRequest 后,Spring 数据 Cassandra 无法执行 Paginaton