Переключитесь с JsonStringType на JsonBinaryType, когда в проекте используются MySQL и PostgreSQL - PullRequest
2 голосов
/ 12 января 2020


У меня проблема со столбцом json, когда необходимо переключиться с PostgreSQL на MariaDB / MySql.
Я использую Spring Boot + JPA + Hibernate + hibernate-types-52.
Таблица, которую я хочу отобразить, выглядит следующим образом:

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

Хорошо, это работает для PostgreSQL и MariaDB / MySql.
Проблема в том, когда я хочу развернуть приложение, которое легко переключается с одного на другое, потому что правильная реализация hibernate-types-52 для PostgreSQL и MySQL / MariaDB отличается

Это работает на 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;
  ...
}

Это работает для Posgre SQL

@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 (или любое другое решение для решения этой проблемы) приветствуются.

1 Ответ

0 голосов
/ 15 января 2020

Как я объяснил в этой статье , вы можете иметь конфигурацию по умолчанию, например, используемую 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;
  ...
}

, и переопределить ее с помощью сопоставления XML файл для MySQL:

<?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.

...