在使用Spring时,我尝试运行集成测试,但测试失败,因为H2数据库无法创建表。
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table foo (id binary not null, bar jsonb, primary key (id))" via JDBC Statement
我的实体定义如下:
@Entity(name = "foo")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class Foo {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private Object bar;
}
我的类型是通过com.vladmihalcea:hibernate-types-52:2.14.0
定义的。
我的h2版本是com.h2database:h2:2.0.202
。
如果我删除bar
属性,它将正常工作。
有什么线索吗?
2条答案
按热度按时间bq3bfh9z1#
jsonb
是PostgreSQL数据类型,在H2中不可用。它与PG的json
数据类型的不同之处在于,它在内部存储为二进制结构,更适合某些操作和索引。H2确实有
json
,但请访问https://www.h2database.com/html/datatypes.html#json_typepolhcujo2#
您可以在H2中创建并使用JSONB域。
如果您想在运行于Postgresql上的Spring应用程序中使用H2作为测试数据库,那么将以下内容添加到连接字符串中就可以提供JSONB类型。
对于JPA,您需要分别为运行时和测试配置定制的读写转换器。
在Postgresql转换器中使用
PGObject
,在H2转换器中使用byte[]
。关于为JPA创建自定义转换器,Stackoverflow上应该有足够的答案。