如何在MySQL 8中直接存储Java类为JSON(无需包装类与Jackson)
完全可以直接把Java类存成JSON,不需要额外的包装类,用Hibernate的自定义类型就能实现,全程不用手动调用Jackson,避免人为失误破坏结构。
具体实现步骤
1. 引入依赖
根据你的Hibernate版本,添加对应的Hibernate Types库,Maven示例:
<!-- Hibernate 5.x 用这个 --> <dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-52</artifactId> <version>2.20.0</version> </dependency> <!-- Hibernate 6.x 换这个 --> <dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-60</artifactId> <version>2.20.0</version> </dependency>
2. 改造业务类为JPA实体
不需要包装类,直接把你的业务类改成实体类。推荐把主键单独存为数据库列(方便查询和索引),剩余业务属性打包到JSON字段:
@Data @Entity @Table(name = "some_table") // 定义JSON类型映射规则 @TypeDef(name = "json", typeClass = JsonStringType.class) public class SomeClass { // 数据库主键,单独列存储 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 业务属性打包为JSON存储 @Type(type = "json") @Column(name = "business_data", columnDefinition = "json", nullable = false) private BusinessPayload payload; // 用内部类封装业务属性(也可以单独写外部类) @Data public static class BusinessPayload { private Instant date; private String someInfo; private Integer version; } // 便捷构造方法,避免手动创建Payload public SomeClass(Instant date, String someInfo, Integer version) { this.payload = new BusinessPayload(); this.payload.setDate(date); this.payload.setSomeInfo(someInfo); this.payload.setVersion(version); } // JPA必需的空构造方法 public SomeClass() {} }
如果非要把整个类(包括id)都塞进JSON字段,也可以这么写(不推荐,主键放JSON会降低查询效率):
@Data @Entity @Table(name = "some_table") @TypeDef(name = "json", typeClass = JsonStringType.class) public class SomeClass { // 数据库自增主键,仅用于索引 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long dbId; // 整个对象存为JSON @Type(type = "json") @Column(name = "full_object", columnDefinition = "json", nullable = false) private SomeClass self; // 业务属性 private Long id; private Instant date; private String someInfo; private Integer version; // 构造方法 public SomeClass(Long id, Instant date, String someInfo, Integer version) { this.id = id; this.date = date; this.someInfo = someInfo; this.version = version; this.self = this; } public SomeClass() {} }
3. 直接用JPA操作即可
Hibernate的JsonStringType会自动调用Jackson完成序列化/反序列化,你不用写任何ObjectMapper相关代码,直接像操作普通实体一样用Spring Data JPA或EntityManager就行,完全不用担心结构被破坏。
对应方案A的数据库表结构(DDL):
CREATE TABLE some_table ( id BIGINT AUTO_INCREMENT PRIMARY KEY, business_data JSON NOT NULL );
内容的提问来源于stack exchange,提问作者Ilia
相关产品推荐
相关产品推荐

