Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Hibernate/Spring引导将JSON文件存储为mysql中的JSON数据类型?_Java_Mysql_Json_Hibernate_Spring Boot - Fatal编程技术网

Java 如何使用Hibernate/Spring引导将JSON文件存储为mysql中的JSON数据类型?

Java 如何使用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

我尝试了几种将json文件存储在数据库中的方法,但它最终会为每个条目创建不同的列

我想将其作为“json”类型存储在单个列中。 可能吗

我的json文件

users.json

[
  {
    "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
,这是一种更干净的解决方案。