Как сохранить файл JSON как тип данных JSON в mysql с помощью загрузки Hibernate / Spring? - PullRequest
1 голос
/ 28 января 2020

Я пробовал несколько способов сохранить файл json в базе данных, но в итоге он создает разные столбцы для каждой записи.

Я хочу сохранить его как тип "json" в один столбец. Возможно ли это?

Мой json файл.

пользователей. 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"
    }
  },
...
]

Это приложение с начальной загрузкой, и у меня есть соответствующие контроллеры и службы.

В моем доменном пакете. (Адрес и Компания являются классами Embeddable)

Пользователь. 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 от Джексона

@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, ...

Я хочу сохранить его в одном столбце как * Тип 1029 * с пружинным чехлом.

1 Ответ

1 голос
/ 28 января 2020

Ваш код читает json в список User объектов и сохраняется в базе данных. Вам нужно написать собственный лог c, чтобы сохранить его как json. Есть несколько способов сделать это.

Вы можете сделать что-то вроде

1) Добавить еще одну переменную в User классе скажем private String jsonData

2) В @PrePersist метод, запишите сериализацию c

3) Пометьте другие атрибуты с помощью @JsonInclude() - чтобы включить в Джексона @Transient - чтобы игнорировать в постоянстве в отдельном столбце. Возможно, вы не захотите добавлять эти аннотации к атрибуту id, поскольку каждый объект json будет храниться с указанным идентификатором c в базе данных.

Таким образом, новый атрибут будет выглядеть примерно так:

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

PrePersist:

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

EDIT: Вы можете столкнуться с проблемой, когда атрибуты @Transient равны нулю в методе @PrePersist. В этом случае вы можете использовать метод установки. Но вы должны вызывать этот метод каждый раз, когда любой атрибут изменяется перед вызовом сохранения.

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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...