基于jdbs从JsonStringType切换到JsonBinaryType

问题描述 投票:1回答:1

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

CREATE TABLE atable(
 ...
 acolumn JSON,
 ... 
);

好,它适用于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;
  ...
}

这适用于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;
  ...
}

赞赏从JsonBinaryType切换到JsonStringType的任何一种解决方案(或解决此问题的任何其他解决方案。

mysql postgresql hibernate mariadb hibernate-types
1个回答
0
投票

正如我在this article中所解释的,您可以具有默认配置,例如PostgreSQL使用的配置:

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

并通过MySQL的XML映射文件覆盖它:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="my.package.Atable">
        <property name="acolumn" type="com.vladmihalcea.hibernate.type.json.JsonStringType" />
    </class>
</hibernate-mapping>

只要您同时提供带注释的类和XML映射文件,Hibernate就会合并它们并使用XML映射来覆盖基于注释的类。

这样,对于MySQL,由于您还将提供HBM映射文件,因此将使用JsonStringType,而不是默认的JsonBinaryType

© www.soinside.com 2019 - 2024. All rights reserved.