У меня проблема со столбцом 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
по умолчанию.