我的设置是hibernate / JPA,使用hsqldb进行集成测试。我希望能够使用sql脚本将一些测试数据填充到数据库中。
基本上我正在寻找相当于Spring的
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:test-data-hsql.sql"/>
</jdbc:initialize-database>
除了这个项目使用Spring不是我的选择。我已经阅读了各种hsql文章,建议可以使用文件模式并将路径指向脚本,但我无法使其正常工作。
我的 persistence.xml
<persistence-unit name="test-pu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>...</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"></property>
<property name="hibernate.connection.username" value="sa"></property>
<property name="hibernate.connection.password" value=""></property>
<property name="hibernate.connection.url" value="jdbc:hsqldb:file:test-data-hsql"></property>
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"></property>
<property name="hibernate.hbm2ddl.auto" value="create"></property>
<property name="hibernate.show_sql" value="true"></property>
</properties>
</persistence-unit>
test-data-hsql.script 确实会运行,但始终存在错误。
如果我在脚本中包含DDL语句来创建我得
Caused by: org.hsqldb.HsqlException: invalid schema name: INFORMATION_SCHEMA
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.SchemaManager.getUserSchemaHsqlName(Unknown Source)
at org.hsqldb.StatementSchema.getResult(Unknown Source)
at org.hsqldb.StatementSchema.execute(Unknown Source)
at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
如果我排除DDL语句(希望我可以依赖hbm2ddl.auto = create)那么我得到
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: INFORMATION_SCHEMA.ONETESTUSER
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.SchemaManager.getUserTable(Unknown Source)
at org.hsqldb.scriptio.ScriptReaderText.processStatement(Unknown Source)
at org.hsqldb.scriptio.ScriptReaderText.readLoggedStatement(Unknown Source)
at org.hsqldb.scriptio.ScriptReaderText.readDDL(Unknown Source)
at org.hsqldb.scriptio.ScriptReaderBase.readAll(Unknown Source)
at org.hsqldb.persist.Log.processScript(Unknown Source)
at org.hsqldb.persist.Log.open(Unknown Source)
at org.hsqldb.persist.Logger.open(Unknown Source)
at org.hsqldb.Database.reopen(Unknown Source)
at org.hsqldb.Database.open(Unknown Source)
at org.hsqldb.DatabaseManager.getDatabase(Unknown Source)
有没有人有一个工作脚本文件的示例或更好的方法来执行此操作?如果有替代方案可以支持此功能,我不一定与hsqldb绑定。
更新 我用来产生错误的最小脚本没有引用INFORMATION_SCHEMA
drop table AccessToken if exists
create table AccessToken (id integer generated by default as identity (start with 1), createdAt timestamp not null, lastAccessedAt timestamp, token varchar(255) not null, expirationPolicyId varchar(255) not null, userId varchar(255) not null, primary key (id))
insert into ACCESSTOKEN (id, createdAt, lastAccessedAt, token, expirationPolicyId, userId) values (1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'welcome1', 'oneDayPolicy', 'jtrotter');
答案 0 :(得分:0)
您需要脚本中的DDL语句,否则数据库为空,您将收到第二个错误。
问题出在脚本中,是对mySQL特定元数据模式INFORMATION_SCHEMA的引用。删除对该模式中对象的引用,以便可以完成创建表。