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