当有必要从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的任何一种解决方案(或解决此问题的任何其他解决方案。
正如我在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
。