小编典典

如何使用Hibernate / Spring Boot在mysql中将JSON文件存储为JSON数据类型?

spring-boot

我尝试了几种在数据库中存储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 Boot应用程序,我有相关的控制器和服务。

在我的域名包中。(地址和公司是可嵌入的类)

User.java

@Data
@AllArgsConstructor @NoArgsConstructor
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String username;
    private String email;
    private String phone;
    private String website;

    @Embedded
    private Address address;

    @Embedded
    private Company company;
}

主文件(存储在数据库中)

TypeReference和ObjectMapper来自Jackson

@SpringBootApplication
public class JsondbApplication {
    public static void main(String[] args) {
        SpringApplication.run(JsondbApplication.class, args);
    }

    @Bean
    CommandLineRunner runner(UserService service) {
        return args -> {
            ObjectMapper mapper = new ObjectMapper();
            TypeReference<List<User>> reference = new TypeReference<List<User>>() {};
            InputStream stream = TypeReference.class.getResourceAsStream("/json/users.json");
            try {
                List<User> users = mapper.readValue(stream, reference);
                service.save(users);
                System.out.println("Saved!");
            } catch (Exception h) {
                System.out.println("Unable to save! " + h.getMessage());
            }
        };
    }

}

在MySQL中,它为创建不同的列 id, name, username, ...

我想使用Spring Boot 将它作为类型存储在 单列中json


阅读 1158

收藏
2020-05-30

共1个答案

小编典典

您的代码将json读入User对象列表,并保存到数据库中。您需要编写一些自定义逻辑以将其另存为json。有多种方法可以做到这一点。

你可以做类似的事情

1)在User类中说另一个变量private String jsonData

2)在@PrePersist方法中,编写序列化逻辑

3)在@JsonInclude()- 标记在Jackson中的其他属性- @Transient在持久性中的单独列中忽略。您可能不希望将这些注释添加到id属性,因为每个json对象将根据数据库中的特定ID存储。

因此,新属性将类似于

@NonNull
@Column(columnDefinition = "JSON") // Only if Database has JSON type else this line can be removed
private String jsonData;

坚持:

@PrePersist
public void prePersist() {
    try {
        this.setJsonData(new ObjectMapper().writeValueAsString(this));
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}

编辑:
您可能会遇到方法中@Transient属性为null的问题@PrePersist。在这种情况下,可以使用setter方法。但是您必须在保存调用之前每次更改任何属性时都调用此setter。

public void setJsonData(String jsonData) {
    // Method parameter jsonData is simply ignored
    try {
        this.jsonData = new ObjectMapper().writeValueAsString(this);
    } catch (JsonProcessingException e) {
        log.error(e.getMessage());
    }
}
2020-05-30