如何在没有 AttributeConverter 或 customUserType 的情况下使用 Hibernate 5.2.10 MySQL JSON 支持映射到 Java 实体类?

Posted

技术标签:

【中文标题】如何在没有 AttributeConverter 或 customUserType 的情况下使用 Hibernate 5.2.10 MySQL JSON 支持映射到 Java 实体类?【英文标题】:How to use Hibernate 5.2.10 MySQL JSON support without AttributeConverter or customUserType to map to Java Entity Class? 【发布时间】:2017-11-10 17:47:15 【问题描述】:

我正在尝试将 mysql JSON 列映射到 Java Entity 类。寻找最干净的方法。

在做一些研究后发现了 3 种可能的方法:

    扩展 AbstractSingleColumnStandardBasicType 创建自定义用户类型 使用属性转换器

我使用属性转换器将 JSON 列从 String(因为 MySQL 驱动程序将其转换为 String)转换为我需要的类型 - 这适用于 Hibernate V4.3.10 和 V5.2.10

我试图查找 Hibernate 是否原生支持 JSON,并发现 PR https://github.com/hibernate/hibernate-orm/pull/1395,基于 PR 看起来它确实将 JSON 映射添加到 MySQL 方言,因此让 Hibernate 知道 JSON 列。

这是否意味着我可以使用类似的东西来映射到 DB 中的 JSON 列?@Column(name="json_type_column") Private Object correspondingJsonAttribute;

如果我不能像这样使用它并且需要使用上述 3 种方法之一,我是否有理由需要升级以获得 registerColumnType( Types.JAVA_OBJECT, "json" );,它是 PR 的一部分并且存在于 Hibernate V5.2.10 中, 我是否从 V5.2.10 中获得更多支持 JSON 列的功能?

我还查看了相应的测试用例以了解 JSON 列映射是如何完成的https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/access/MixedAccessTestTask.java,它通过属性使用 @Access 注释,看起来它在将 Entity 中的相应 JSON 列变量从字符串。

非常感谢任何帮助。

谢谢!

【问题讨论】:

【参考方案1】:

在做一些研究后发现了 3 种可能的方法:

扩展 AbstractSingleColumnStandardBasicType 创建自定义用户类型 使用属性转换器

AttributeConvertor 对此无济于事,但您仍然可以使用 custom UserType 或 Hibernate Type Descriptors。

这是否意味着我可以使用这样的东西来映射到 JSON 列 数据库?

@Column(name="json_type_column")  Private Object
correspondingJsonAttribute;

没有。 json 类型仅用于 JDBC,以便 Hibernate 在为 PreparedStatement 设置参数或获取 ResultSet 时知道如何处理该 JDBC 对象。

我是否从 V5.2.10 中获得更多支持 JSON 列的功能?

不,但您只需要提供your own JSON type。

您可以使用 Maven Central 上提供的 hibernate-types

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>$hibernate-types.version</version>
</dependency>

并使用 Hibernate Types 提供的JdonType,因为它可以在 MySQL、PostgreSQL、Oracle、SQL Server 或 H2 上运行,无需进行任何修改。

【讨论】:

非常感谢@vlad 的回复,我还有几个问题,正在尝试快速测试与此相关的内容,之后会在此处更新。 我试图理解为什么attributeConverter 不能解决这个问题,所以用这两种方法构建了一个sample application 来理解差异。它似乎有相同的结果?你能在这里指导我吗? 拥有属性转换器需要我为我需要的每种新类型都有一个转换器,除此之外还有其他负面影响吗?我的converter 是基于this one

以上是关于如何在没有 AttributeConverter 或 customUserType 的情况下使用 Hibernate 5.2.10 MySQL JSON 支持映射到 Java 实体类?的主要内容,如果未能解决你的问题,请参考以下文章

JPA/Hibernate:在复杂类上使用 AttributeConverter 时创建 UserType 是不是显而易见?

spring jpa之实体属性类型转换器AttributeConverter,自定义Converter,通用Converter

使用 AttributeConverter 的 Spring Boot 测试不适用于 Maven 测试

LocalDateTime 的 JPA AttributeConverter

jpa AttributeConverter 是不是适用于查询子句?

JPA AttributeConverter和Hibernate的ColumnTransformer在属性的加密和解密方面的区别