首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用JPA和Hibernate将JSON列映射到MySQL实体属性

如何使用JPA和Hibernate将JSON列映射到MySQL实体属性
EN

Stack Overflow用户
提问于 2017-06-01 20:56:44
回答 6查看 39.8K关注 0票数 25

我将MySQL列声明为JSON类型,但在将其与Jpa/Hibernate进行映射时遇到了问题。我在后端使用Spring Boot。

下面是我的代码的一小部分:

@Entity
@Table(name = "some_table_name")
public class MyCustomEntity implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name = "json_value")
private JSONArray jsonValue;

程序返回一个错误,并告诉我无法映射该列。

在mysql表中,该列定义为:

json_value JSON不为空;

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-10-11 04:07:57

我更喜欢这样做:

  • 创建从映射到字符串的转换器(属性转换器),反之亦然。
  • 使用映射在域(实体)类

中映射mysql JSON列类型

代码如下。

JsonToMapConverted.java

@Converter
public class JsonToMapConverter 
                    implements AttributeConverter<String, Map<String, Object>> 
{
    private static final Logger LOGGER = LoggerFactory.getLogger(JsonToMapConverter.class);

    @Override
    @SuppressWarnings("unchecked")
    public Map<String, Object> convertToDatabaseColumn(String attribute)
    {
        if (attribute == null) {
           return new HashMap<>();
        }
        try
        {
            ObjectMapper objectMapper = new ObjectMapper();
            return objectMapper.readValue(attribute, HashMap.class);
        }
        catch (IOException e) {
            LOGGER.error("Convert error while trying to convert string(JSON) to map data structure.");
        }
        return new HashMap<>();
    }

    @Override
    public String convertToEntityAttribute(Map<String, Object> dbData)
    {
        try
        {
            ObjectMapper objectMapper = new ObjectMapper();
            return objectMapper.writeValueAsString(dbData);
        }
        catch (JsonProcessingException e)
        {
            LOGGER.error("Could not convert map to json string.");
            return null;
        }
    }
}

域(实体映射)类的

部分

...

@Column(name = "meta_data", columnDefinition = "json")
@Convert(attributeName = "data", converter = JsonToMapConverter.class)
private Map<String, Object> metaData = new HashMap<>();

...

这个解决方案非常适合我。

票数 17
EN

Stack Overflow用户

发布于 2019-09-15 01:58:05

您不必手动创建所有这些类型,您只需使用以下依赖项通过Maven Central获取它们:

com.vladmihalcea hibernate-types-52 ${hibernate-Typees.Version}

有关更多信息,请查看Hibernate Types open-source project

现在,来解释一下它是如何工作的。

假设您有以下实体:

@Entity(name = "Book")
@Table(name = "book")
@TypeDef(
    name = "json", 
    typeClass = JsonType.class
)
public class Book {
 
    @Id
    @GeneratedValue
    private Long id;
 
    @NaturalId
    private String isbn;
 
    @Type(type = "json")
    @Column(columnDefinition = "json")
    private String properties;
 
    //Getters and setters omitted for brevity
}

注意上面代码片段中的两件事:

JsonType

  • the String

属性处理的

  • @TypeDef用于定义新的自定义Hibernate类型,它具有一个映射为jsonjson列类型

就这样!

现在,如果您保存一个实体:

Book book = new Book();
book.setIsbn("978-9730228236");
book.setProperties(
    "{" +
    "   \"title\": \"High-Performance Java Persistence\"," +
    "   \"author\": \"Vlad Mihalcea\"," +
    "   \"publisher\": \"Amazon\"," +
    "   \"price\": 44.99" +
    "}"
);
 
entityManager.persist(book);

Hibernate将生成以下SQL语句:

INSERT INTO
    book 
(
    isbn, 
    properties, 
    id
) 
VALUES
(
    '978-9730228236', 
    '{"title":"High-Performance Java Persistence","author":"Vlad Mihalcea","publisher":"Amazon","price":44.99}',  
    1
)

您还可以重新加载并修改它:

Book book = entityManager
    .unwrap(Session.class)
    .bySimpleNaturalId(Book.class)
    .load("978-9730228236");
     
book.setProperties(
    "{" +
    "   \"title\": \"High-Performance Java Persistence\"," +
    "   \"author\": \"Vlad Mihalcea\"," +
    "   \"publisher\": \"Amazon\"," +
    "   \"price\": 44.99," +
    "   \"url\": \"https://www.amazon.com/High-Performance-Java-Persistence-Vlad-Mihalcea/dp/973022823X/\"" +
    "}"
);

Hibernate为您处理UPDATE语句:

SELECT  b.id AS id1_0_
FROM    book b
WHERE   b.isbn = '978-9730228236'
 
SELECT  b.id AS id1_0_0_ ,
        b.isbn AS isbn2_0_0_ ,
        b.properties AS properti3_0_0_
FROM    book b
WHERE   b.id = 1    
 
UPDATE
    book 
SET
    properties = '{"title":"High-Performance Java Persistence","author":"Vlad Mihalcea","publisher":"Amazon","price":44.99,"url":"https://www.amazon.com/High-Performance-Java-Persistence-Vlad-Mihalcea/dp/973022823X/"}'
WHERE
    id = 1

所有代码都可以在上找到。

票数 11
EN

Stack Overflow用户

发布于 2017-12-14 03:58:38

如果您的json数组中的值是简单的字符串,您可以这样做:

@Type( type = "json" )
@Column( columnDefinition = "json" )
private String[] jsonValue;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44308167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档