当项目同时使用 MySQL 和 PostgreSQL 时,从 JsonStringType 切换到 JsonBinaryType

ada*_*dam 7 mysql postgresql hibernate mariadb hibernate-types


当需要从 PostgreSQL 切换到 MariaDB/MySql 时,我遇到了列 json 的问题。
我使用 Spring Boot + JPA + Hibernate + hibernate-types-52。
我要映射的表是这样的:

CREATE TABLE atable(
 ...
 acolumn JSON,
 ... 
);
Run Code Online (Sandbox Code Playgroud)

好的,它适用于 PostgreSQL 和 MariaDB/MySql。
问题是当我想部署一个可以轻松从一个切换到另一个的应用程序时,因为 PostgreSQL 和 MySQL/MariaDB 的正确 hibernate-types-52 实现是不同的

这适用于 MySQL/MariaDB

@Entity
@Table(name = "atable")
@TypeDef(name = "json", typeClass = JsonStringType.class)
  public class Atable {
  ...
  @Type(type = "json")
  @Column(name = "acolumn", columnDefinition = "json")
  private JsonNode acolumn;
  ...
}
Run Code Online (Sandbox Code Playgroud)

这适用于 PosgreSQL

@Entity
@Table(name = "atable")
@TypeDef(name = "json", typeClass = JsonBinaryType.class)
public class Atable {
  ...
  @Type(type = "json")
  @Column(name = "acolumn", columnDefinition = "json")
  private JsonNode acolumn;
  ...
}
Run Code Online (Sandbox Code Playgroud)

任何类型的从 JsonBinaryType 切换到 JsonStringType(或任何其他解决方案)的解决方案都值得赞赏。

Vla*_*cea 6

2.11Hibernate Types 项目的版本开始,您可以只使用JsonType,它适用于 PostgreSQL、MySQL、Oracle、SQL Server 或 H2。

因此,使用JsonType代替JsonBinaryTypeJsonStringType

@Entity
@Table(name = "atable")
@TypeDef(name = "json", typeClass = JsonType.class)
public class Atable {

  @Type(type = "json")
  @Column(name = "acolumn", columnDefinition = "json")
  private JsonNode acolumn;

}
Run Code Online (Sandbox Code Playgroud)

就是这样!