Java 如何使用Hibernate/Spring引导将JSON文件存储为mysql中的JSON数据类型?
我尝试了几种将json文件存储在数据库中的方法,但它最终会为每个条目创建不同的列 我想将其作为“json”类型存储在单个列中。 可能吗 我的json文件 users.jsonJava 如何使用Hibernate/Spring引导将JSON文件存储为mysql中的JSON数据类型?,java,mysql,json,hibernate,spring-boot,Java,Mysql,Json,Hibernate,Spring Boot,我尝试了几种将json文件存储在数据库中的方法,但它最终会为每个条目创建不同的列 我想将其作为“json”类型存储在单个列中。 可能吗 我的json文件 users.json [ { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz", "address": { "street": "Kulas Light", "s
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
},
...
]
这是一个spring启动应用程序,我有相关的控制器和服务
在我的域名包。(地址和公司是可嵌入类)
User.java
@数据
@AllArgsConstructor@NoArgsConstructor
@实体
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
私有字符串名称;
私有字符串用户名;
私人字符串电子邮件;
私人电话;
私人字符串网站;
@嵌入
私人地址;
@嵌入
私营公司;
}
主文件(存储在数据库中)
TypeReference和ObjectMapper来自Jackson
@springboot应用程序
公共类JsondbApplication{
公共静态void main(字符串[]args){
run(JsondbApplication.class,args);
}
@豆子
CommandLineRunner运行程序(用户服务){
返回参数->{
ObjectMapper mapper=新的ObjectMapper();
TypeReference=新的TypeReference(){};
InputStream=TypeReference.class.getResourceAsStream(“/json/users.json”);
试一试{
List users=mapper.readValue(流,引用);
服务。保存(用户);
System.out.println(“已保存!”);
}捕获(异常h){
System.out.println(“无法保存!”+h.getMessage());
}
};
}
}
在mysql中,它为id、名称、用户名等创建不同的列
我想使用spring boot将它存储在一个单列中,作为
json
类型。您的代码将json读入用户
对象列表,并保存到数据库中。您需要编写一些自定义逻辑以将其保存为json。有多种方法可以做到这一点
你可以这样做
1) 在User
类中添加另一个变量,例如private String jsonData
2) 在@PrePersist
方法中,编写序列化逻辑
3) 使用@JsonInclude()
-标记其他属性以包含在Jackson
@瞬态
-在单独列中的持久性中忽略。您可能不想将这些注释添加到id
属性中,因为每个json对象都将根据数据库中的特定id进行存储
所以,新属性应该是
@NonNull
@Column(columnDefinition=“JSON”)//仅当数据库具有JSON类型时,否则可以删除此行
私有字符串jsonData;
预科生:
@PrePersist
公立大学预科生(){
试一试{
this.setJsonData(新的ObjectMapper().writeValueAsString(this));
}捕获(JsonProcessingException e){
e、 printStackTrace();
}
}
编辑:
在@PrePersist
方法中,您可能会遇到@Transient
属性为null的问题。在这种情况下,可以使用setter方法。但是每次在save调用之前更改任何属性时,都必须调用此setter
public void setJsonData(字符串jsonData){
//方法参数jsonData被忽略
试一试{
this.jsonData=newObjectMapper().writeValueAsString(this);
}捕获(JsonProcessingException e){
log.error(例如getMessage());
}
}
我想与您联系,因为我正在处理同一个项目。这是我的邮箱号,你能在这里给我打电话吗shubhamnavghare10@gmail.com请使用您用来保存到数据库的代码更新您的问题,请检查。为什么要存储在单列中?你不想要像2列一样的东西吗-id和jsonObj?我只想知道我们可以将完整的JSON文档存储为JSON类型吗?使用它可以将“jsonData”创建为“varchar”。我希望将整个文档存储为“json”类型,请尝试使用@Column(columnDefinition=“json”)
存储jsonData
。此外,我还更新了我的答案,使用了@PrePersist
,这是一种更干净的解决方案。