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


У меня проблема со столбцом 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;
  ...
}

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

Всего 1 ответ


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


Есть идеи?

10000