gpt4 book ai didi

java - 使用 Hibernate 和 JPA 持久化 JSON 对象

转载 作者:行者123 更新时间:2023-12-03 21:18:47 24 4
gpt4 key购买 nike

我试图在 Spring 启动时在 MySQL 数据库中存储一个 JSON 对象。我知道我做错了什么,但我无法弄清楚它是什么,因为我对 Spring 相当陌生。

我有一个休息端点,在那里我获得了以下 JSON 对象(通过 HTTP PUT),我需要将它存储在数据库中,以便用户可以稍后(通过 HTTP GET)获取它。

{
"A": {
"Name": "Cat",
"Age": "1"
},
"B": {
"Name": "Dog",
"Age": "2"
},
"C": {
"Name": "Horse",
"Age": "1"
}
}

请注意,在上述情况下 号码 key 在对象中可能会有所不同,由于该要求,我正在使用 HashMap捕捉 Controller 中的对象。
@RequestMapping(method = RequestMethod.POST)
public String addPostCollection(@RequestBody HashMap<String, Animal> hp) {

hp.forEach((x, y) -> {
postRepository.save(hp.get(x));
});

return "OK";

}

正如你在方法中看到的,我可以迭代 HashMap并坚持每个 Animal db 中的对象。但我正在寻找一种方法来坚持整个 HashMap在一个记录中。我做了一些阅读,他们建议我使用 @ManyToMany映射。

谁能指出我坚持 HashMap 的方向以不同的方式? (或者使用 @ManyToMany 是唯一正确的方法吗?)

最佳答案

Maven 依赖
您需要做的第一件事是设置以下Hibernate Types项目中的 Maven 依赖项 pom.xml配置文件:

<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
领域模型
假设您有以下实体:
@Entity(name = "Book")
@Table(name = "book")
@TypeDef(
typeClass = JsonType.class,
defaultForType = JsonNode.class
)
public class Book {

@Id
@GeneratedValue
private Long id;

@NaturalId
private String isbn;

@Column(columnDefinition = "jsonb")
private JsonNode properties;

//Getters and setters omitted for brevity
}
请注意 @TypeDef用于指示 Hibernate 映射 JsonNode对象使用 JsonType 由 Hibernate Types 项目提供。
测试时间
现在,如果您保存实体:
Book book = new Book();
book.setIsbn( "978-9730228236" );
book.setProperties(
JacksonUtil.toJsonNode(
"{" +
" \"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
)
您还可以重新加载并修改它:
Session session = entityManager.unwrap( Session.class );

Book book = session
.bySimpleNaturalId( Book.class )
.load( "978-9730228236" );

LOGGER.info( "Book details: {}", book.getProperties() );

book.setProperties(
JacksonUtil.toJsonNode(
"{" +
" \"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

-- Book details: {"price":44.99,"title":"High-Performance Java Persistence","author":"Vlad Mihalcea","publisher":"Amazon"}

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

关于java - 使用 Hibernate 和 JPA 持久化 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40802656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com