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

San*_*eep 2 java mysql json hibernate jpa

我正在尝试将 MySQL JSON 列映射到 Java 实体类。寻找最干净的方法来做到这一点。

经过一些研究,发现了 3 种可能的方法:

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

我使用属性转换器将 JSON 列从字符串(因为 MySQL 驱动程序将其转换为字符串)转换为我需要的类型 - 这适用于 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注解,看起来它在从String转换后将Entity中对应的JSON列变量设置为Map。

任何帮助深表感谢。

谢谢!

Vla*_*cea 5

经过一些研究,发现了 3 种可能的方法:

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

AttributeConvertor不会为此提供帮助,但您仍然可以使用自定义UserTypeHibernate Type Descriptors

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

@Column(name="json_type_column")  Private Object
correspondingJsonAttribute;
Run Code Online (Sandbox Code Playgroud)

不。该json类型仅适用于 JDBC,因此 Hibernate 知道在 a 上设置参数PreparedStatement或获取ResultSet.

我是否从 V5.2.10 中获得了更多支持 JSON 列的特性?

不,但您只需要提供您自己的 JSON 类型

您可以只使用hibernate-typesMaven Central 上提供的 。

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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