将 MySQL json 列映射到 JPA 会引发错误

Posted

技术标签:

【中文标题】将 MySQL json 列映射到 JPA 会引发错误【英文标题】:Mapping MySQL json column into JPA throws error 【发布时间】:2018-12-02 22:57:03 【问题描述】:

我想将 mysql JSON 列映射到 JPA。我做了一些研究并使用了

@Type( type = "json" )
@Column( columnDefinition = "json" )

但这会引发异常

Exception in thread "main" org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [json]
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:348)
    at org.hibernate.boot.internal.ClassLoaderAccessImpl.classForName(ClassLoaderAccessImpl.java:62)
    at org.hibernate.cfg.annotations.SimpleValueBinder.fillSimpleValue(SimpleValueBinder.java:538)
    at org.hibernate.cfg.SetSimpleValueTypeSecondPass.doSecondPass(SetSimpleValueTypeSecondPass.java:25)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1621)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1579)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at com.savemonk.ce.utility.hibernateAndJPA.JPAUtility.getEntityManagerFactory(JPAUtility.java:12)
    at com.savemonk.ce.v2.pricegraph.manager.AddNewPriceTrackRecord.addNewPriceTrackRecordTest(AddNewPriceTrackRecord.java:29)
    at com.savemonk.ce.v2.pricegraph.manager.AddNewPriceTrackRecord.main(AddNewPriceTrackRecord.java:23)
Caused by: java.lang.ClassNotFoundException: Could not load requested class : json
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader.findClass(ClassLoaderServiceImpl.java:336)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:345)
    ... 14 more

我知道@Type 是hibernate 的org.hibernate.annotations.Type 在 JPA 中映射列的正确方法是什么?

如果需要,我可以发布实体类。 任何解释 JPA + JSON-type-column 的链接和资源都会有很大帮助。

【问题讨论】:

【参考方案1】:

Hibernate ORM 中没有json 类型。您可以使用提供 JSON 支持的 Hibernate Types project。

要添加对json 的支持,请将以下@TypeDef 注释添加到您的实体:

@TypeDef(name = "json", typeClass = JsonStringType.class)

您还需要添加以下 Maven 依赖项:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>$hibernate-types.version</version>
</dependency>

查看this article 了解如何将JsonStringType 与 MySQL 一起使用。

【讨论】:

【参考方案2】:

除了依赖,还需要添加

@TypeDef(name = "json", typeClass = JsonStringType.class)

到您的实体类声明之一

【讨论】:

以上是关于将 MySQL json 列映射到 JPA 会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA/Hibernate 注释将 MySQL char(n) 列映射到实例变量?

将 PostgreSQL JSON 列映射到 Hibernate 实体属性

将 MySQL JSON 列映射到休眠值类型

如何在pojo中用jpa或hibernate映射json字段?

将 MySql 数据库中的 JSON 列映射到 Web Api 中的 C# 类

将 MySql 视图映射到 JPA 实体,使用哪个唯一 ID?