• 在 Hibernate 6.x 中支持 JSON 类型字段的实体映射

    • 2023-05-25 00:30
    • 字数 236
    • 阅读 1,023

    在 Hibernate 6.x 中,可以使用 @Type(JsonType.class) 直接将字段映射为 JsonType 类型,而不再需要使用 @Type(type = "json") 来指定 Hibernate 5.x 中提供的 JSON 类型。JsonType 类是 Hibernate 6.x 提供的内置类型之一,在处理 JSON 类型字段时非常方便。因此,建议尽可能使用 @Type(JsonType.class) 来映射 JSON 类型的字段,以获得更好的性能和灵活性。

    首先引入 hibernate-types-60 依赖库:

    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    	implementation 'com.alibaba.fastjson2:fastjson2:2.0.32'
    	implementation 'com.vladmihalcea:hibernate-types-60:2.21.1'
    	compileOnly 'org.projectlombok:lombok'
    	runtimeOnly 'com.mysql:mysql-connector-j'
    	annotationProcessor 'org.projectlombok:lombok'
    }

    然后编写实体类如下:

    import com.alibaba.fastjson2.JSONObject;
    import com.fasterxml.jackson.annotation.JsonFormat;
    import com.vladmihalcea.hibernate.type.json.JsonType;
    import jakarta.persistence.Column;
    import jakarta.persistence.Entity;
    import jakarta.persistence.GeneratedValue;
    import jakarta.persistence.GenerationType;
    import jakarta.persistence.Id;
    import jakarta.persistence.Table;
    import lombok.Data;
    import org.hibernate.annotations.Type;
    
    import java.time.LocalDateTime;
    
    @Data
    @Entity
    @Table(name = "message")
    public class Message {
        /**
         * 消息主键
         */
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        /**
         * 消息接收方
         */
        @Column(name = "recipient")
        private String recipient;
    
        /**
         * 消息内容
         */
        @Type(JsonType.class)
        @Column(name = "content", columnDefinition = "json")
        private JSONObject content;
    
        /**
         * 创建时间
         */
        @Column(name = "create_time")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private LocalDateTime createTime;
    }
back_to_top