You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:48:08