【问题标题】:HSQLDB with Postgresql: type not found or user lacks privilege: BIGSERIAL带有 Postgresql 的 HSQLDB:找不到类型或用户缺少权限:BIGSERIAL
【发布时间】:2018-05-22 00:00:24
【问题描述】:

我正在构建 Spring+Hibernate Java 应用程序。我想添加一些集成测试,在 in-memory 数据库中完成。

所以,我的普通数据库是 Postgresql,我使用使用 flyway 插件运行的 .sql 脚本来填充它。 ID 字段设置为 BIGSERIAL。我想使用 in-memory 数据库来模仿我原来的数据库,然后尝试用它测试一些类。我设法配置了几乎所有东西(我希望如此),但是当我运行测试类本身时,CREATE TABLE 脚本出现错误:

原因:org.hsqldb.HsqlException:找不到类型或用户缺少权限:BIGSERIAL

我发现我应该配置 HSQLDB,以启用 Postgresql 兼容性。 使用 SET DATABASE SQL SYNTAX 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;
    }
}

在测试类本身:

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

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

}

我在 URL 的末尾添加了所需的属性,在互联网上找到了这个确切属性的示例,但它并没有解决我的问题。

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

我做错了什么?

【问题讨论】:

    标签: java unit-testing hsqldb


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-03
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2016-12-31
      • 1970-01-01
      • 2019-09-09
      相关资源
      最近更新 更多