java 如何将jsonb列用于H2、JPA和Hibernate

cl25kdpy  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(252)

在使用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属性,它将正常工作。
有什么线索吗?

bq3bfh9z

bq3bfh9z1#

jsonb是PostgreSQL数据类型,在H2中不可用。它与PG的json数据类型的不同之处在于,它在内部存储为二进制结构,更适合某些操作和索引。
H2确实有json,但请访问https://www.h2database.com/html/datatypes.html#json_type

polhcujo

polhcujo2#

您可以在H2中创建并使用JSONB域。
如果您想在运行于Postgresql上的Spring应用程序中使用H2作为测试数据库,那么将以下内容添加到连接字符串中就可以提供JSONB类型。

jdbc:h2:mem:public;MODE=PostgreSQL;INIT=CREATE DOMAIN IF NOT EXISTS JSONB AS JSON;

对于JPA,您需要分别为运行时和测试配置定制的读写转换器。
在Postgresql转换器中使用PGObject,在H2转换器中使用byte[]。关于为JPA创建自定义转换器,Stackoverflow上应该有足够的答案。

相关问题