背景
- 從 MySQL 5.7.8 開始,MySQL 支持原生的 JSON 數據類型。
- 那使用ORM框架時,如何把MySQL的JSON類型映射到Java字段上?
開發環境
- Maven3.5
- Spring Boot 2.2.1 RELEASE
- Spring Data JPA 2.2.1 RELEASE
- Hibernate 5.4.10 Final
使用如下
- pom.xml引入(只顯示和文章有關的依賴)
-
<properties> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <resource.delimiter>@</resource.delimiter> <spring-boot-starter.version>2.2.1.RELEASE</spring-boot-starter.version> </properties> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring-boot-starter.version}</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>${spring-boot-starter.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.10.Final</version> </dependency> <dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-52</artifactId> <version>2.9.4</version> </dependency>
- 注意:一定要引入hibernate-types-XXXX這個依賴!!
- Java實體配置
-
/** * @author ******** * @Description: 審計記錄 * @date 2020/4/27 */ @Entity @Table(name = "audit_record", uniqueConstraints = { @UniqueConstraint(name = "audit_record_mid",columnNames = {"audit_record_mid"}) }) @Getter @Setter @DynamicInsert @DynamicUpdate @TypeDef(name="json",typeClass = JsonStringType.class) public class AuditRecordTable implements Serializable { @JsonIgnore @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "audit_record_id", columnDefinition = "BIGINT", updatable = false, nullable = false, unique = true) private BigInteger auditRecordId; @JsonIgnore @Column(name = "audit_record_mid", columnDefinition = "varchar(36) NOT NULL COMMENT '記錄編號'") private String auditRecordMid; @JsonIgnore @Column(name = "audit_date", columnDefinition = "varchar(36) NOT NULL COMMENT '審計日期'") private String auditDate; @JsonIgnore @Column(name = "order_total_amount", columnDefinition = "decimal(20,6) NOT NULL COMMENT '訂單總金額'") private BigDecimal orderTotalAmount; @JsonIgnore @Column(name = "payment_total_amount", columnDefinition = "decimal(20,6) NOT NULL COMMENT '支付總金額'") private BigDecimal paymentTotalAmount; @JsonIgnore @Type(type="json") @Column(name = "paied_order_mid_list", columnDefinition = "json") private List<String> paiedOrderMidList; @JsonIgnore @CreationTimestamp @Column(name = "cdate", updatable = false, columnDefinition = "timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP") private LocalDateTime cdate; @JsonIgnore @UpdateTimestamp @Column(name = "mdate", columnDefinition = "timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") private LocalDateTime mdate; }
- Java實體中,對應MySQL中的JSON類型配置已標記顏色!!!
- MySQL自動建表如下圖