使用Postgresql的HSQLDB:未找到类型或用户缺少权限:BIGSERIAL

时间:2017-12-07 19:35:41

标签: java unit-testing hsqldb

我正在构建Spring + Hibernate Java Application。我想在内存中数据库中添加一些集成测试。

所以,我的普通数据库是Postgresql,我使用与flyway插件一起运行的.sql脚本填充它。 ID字段设置为BIGSERIAL。我想使用内存数据库,类似我的原始数据库,然后尝试用它来测试一些类。我设法安装了很多东西(我希望如此),但是当我运行测试类本身时,我得到了CREATE TABLE脚本的错误:

引起:org.hsqldb.HsqlException:未找到类型或用户缺少权限:BIGSERIAL

我发现我应该配置HSQLDB,以启用Postgresql兼容性。 使用SET DATABASE SQL语法PGS TRUE或等效的URL属性sql.syntax_pgs = true来启用PostgreSQL的非标准功能。

我使用persistence.xml来定义普通和测试持久性单元。这是负责定义测试持久性单元的片段:

<persistence-unit name="testJPA">
        <properties>
            <property name="hibernate.archive.autodetection" value="class, hbm"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.connection.password" value=""/>
            <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:butterfly;sql.syntax_pgs=true"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
        </properties>
    </persistence-unit>

然后我使用配置类进行测试:

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"core.utilities"} )
@EnableTransactionManagement
public class TestsInitializer {
    @Bean
    public LocalEntityManagerFactoryBean entityManagerFactory() {
        LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
        factoryBean.setPersistenceUnitName("testJPA");
        return factoryBean;
    }
}

在testclass中:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestsInitializer.class }/*, loader = AnnotationConfigContextLoader.class*/)
@Transactional
public class GenreBATest {  
    @Autowired
    private GenreBA genreBA;

    @Test
    public void testFindAllAccounts() {
        //whatever
    }

}

我在网址末尾添加了必需的属性,在互联网上找到了这个确切属性的示例,但它无法解决我的问题。

我仍然得到:消息:未找到类型或用户缺少权限:BIGSERIAL

我做错了什么?

1 个答案:

答案 0 :(得分:0)

好的,我发现脚本是由flyway运行的,忽略了persistence.xml中所有可能的语法命令。并且flyway运行HSQLDB因为我在测试配置类中使用了@EnableAutoConfiguration而没有排除:)我通过艰难的方式了解到Spring Boot已经配置Hibernate来创建基于内存数据库的实体的模式。所以我根本不需要使用数据库脚本,它们是偶然运行的。