hibernate - 如何在 H2 数据库中伪造 ENUM 列以进行单元测试?

标签 hibernate playframework h2

我有一套玩!我一直在针对 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 )

将 Play 设置为使用 H2Dialect 进行测试模式并不能解决问题。似乎根本原因是 H2 不支持枚举,或者 H2Dialect 可能不知道 H2 的伪枚举。

Play 中有没有办法在 H2 中使用枚举测试模型?

最佳答案

这里有一个适用于带有 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确保在任何框架对其执行 ddl 的第一位之前执行它的原因

所以,在 的情况下玩! 设置为 db.default.jdbcUrl - 或者您定义您的测试数据库连接(例如作为特征)

关于hibernate - 如何在 H2 数据库中伪造 ENUM 列以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7988599/

相关文章:

spring - 无法将名称[org.hibernate.dialect.MySQL5Dialect]解析为策略[org.hibernate.dialect.Dialect]

hibernate - Spring/Hibernate @Transactional - 在它应该之前关闭 session

jquery - 如何通过 AJAX 到 HTTP 请求 JSON 来预填充 Web 表单?

java - 与同一 H2 内存数据库建立多个连接

mysql - hibernate - 两个日期之间的差异

java - Hibernate 中的月份不是有效月份

hibernate - 如何在 Nhibernate 中使用 case 和 order by?

java - 使用Java Play发送HTTP请求(WSClient初始化)

java - 通过使用助手生成 html

java - Hibernate:创建表异常