我有一套游戏!单元测试我一直在对H2数据库运行。我在模型中添加了一些枚举列,现在测试失败了,因为用于创建模型表的sql语句。
错误消息是:
14:42:10,435 ERROR ~ Unknown data type: "ENUM"; SQL statement:
有些搜索显示有办法在H2中模拟枚举(例如:http://groups.google.com/group/h2-database/search?group=h2-database&q=enum&qt_g=Search+this+group)
设置播放以将H2Dialect用于测试模式无法解决问题。似乎根本原因是H2不支持枚举,或者H2Dialect可能不知道H2的伪枚举。
Play中有没有办法在H2中测试带枚举的模型?
答案 0 :(得分:5)
这里有一个适用于带有H2的spring-boot的解决方法 - 它不依赖于任何一个,所以你可以这样做 类似的游戏。
请注意,这是假的,并不是真的 允许您完全测试枚举,但它允许您运行测试 对于预先存在的生产数据库(你不能只是去改变它) 模式)而不必自己编写整个DDL。
因此,不要让测试框架为内存数据库设置连接字符串,而是自己配置H2连接字符串 。
以下是魔术设置在我的情况下的表现:
# the next line is very important it names the ddl work
# H2 does not support enums
# In order to fake support for them we have to declare a
# domain called enum and mapped it to a varchar - the size
# I picked at random but it is "good enough" for now.
# H2 will run this before hibernate creates the schema and
# then the schema creation will succeed
spring.datasource.url=jdbc:h2:mem:test;MODE=MySQL;INIT=CREATE DOMAIN IF NOT EXISTS enum as VARCHAR(255);DB_CLOSE_ON_EXIT=FALSE
神奇之处在于:
CREATE DOMAIN IF NOT EXISTS enum as VARCHAR(255)
这告诉H2将自定义(域)数据类型枚举视为varchar - 您显然可以将大小更改为任何内容。
它与INIT
原因一样,确保在执行任何框架
因此,如果播放!,设置将为db.default.jdbcUrl
- 或者您定义测试数据库连接(例如,作为特征)
答案 1 :(得分:1)
通常JPA会将它转换为基本类型。请参阅Map enum in JPA with fixed values?或JPA Enum ORDINAL vs STRING。我认为这是与数据库无关的唯一方法。