如何在没有 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在属性的加密和解密方面的区别