1. Обзор
В некоторых проектах может потребоваться сохранение объектов JSON в реляционной базе данных.
В этом уроке мы увидим, как взять объект JSON и сохранить его в реляционной базе данных .
Существует несколько фреймворков, обеспечивающих эту функциональность, но мы рассмотрим несколько простых, общих опций, использующих только Hibernate и Jackson .
2. Зависимости
Мы будем использовать зависимость basic Hibernate Core для этого урока:
org.hibernate hibernate-core 5.4.0.Final
Мы также будем использовать Jackson в качестве нашей библиотеки JSON:
com.fasterxml.jackson.core jackson-databind 2.9.8
Обратите внимание, что эти методы не ограничиваются этими двумя библиотеками. Мы можем заменить ваш любимый поставщик JPA и библиотеку JSON.
3. Методы сериализации и десериализации
Самый простой способ сохранить объект JSON в реляционной базе данных-это преобразовать объект в Строку перед его сохранением. Затем мы преобразуем его обратно в объект , когда мы извлекаем его из базы данных.
Мы можем сделать это несколькими различными способами.
Первый, который мы рассмотрим, – это использование пользовательских методов сериализации и десериализации.
Мы начнем с простой сущности Customer , которая хранит имя и фамилию клиента, а также некоторые атрибуты этого клиента.
Стандартный объект JSON будет представлять эти атрибуты в виде HashMap , так что это то, что мы будем использовать здесь:
@Entity @Table(name = "Customers") public class Customer { @Id private int id; private String firstName; private String lastName; private String customerAttributeJSON; @Convert(converter = HashMapConverter.class) private MapcustomerAttributes; }
Вместо того, чтобы сохранять атрибуты в отдельной таблице, мы собираемся сохранить их в виде JSON в столбце в таблице Customers . Это может помочь снизить сложность схемы и повысить производительность запросов.
Во-первых, мы создадим метод сериализации, который будет принимать наши атрибуты клиента и преобразовывать его в строку JSON :
public void serializeCustomerAttributes() throws JsonProcessingException { this.customerAttributeJSON = objectMapper.writeValueAsString(customerAttributes); }
Мы можем вызвать этот метод вручную перед сохранением, или мы можем вызвать его из метода set Customer Attributes , чтобы при каждом обновлении атрибутов также обновлялась строка JSON.
Далее, мы создадим метод для десериализации строки JSON обратно в HashMap объект при извлечении Клиента из базы данных:
public void deserializeCustomerAttributes() throws IOException { this.customerAttributes = objectMapper.readValue(customerAttributeJSON, HashMap.class); }
Опять же, есть несколько разных мест, из которых мы можем вызвать этот метод, но в этом примере мы вызовем его вручную.
Итак, сохранение и извлечение нашего объекта Customer будет выглядеть примерно так:
@Test public void whenStoringAJsonColumn_thenDeserializedVersionMatches() { Customer customer = new Customer(); customer.setFirstName("first name"); customer.setLastName("last name"); Mapattributes = new HashMap<>(); attributes.put("address", "123 Main Street"); attributes.put("zipcode", 12345); customer.setCustomerAttributes(attributes); customer.serializeCustomerAttributes(); String serialized = customer.getCustomerAttributeJSON(); customer.setCustomerAttributeJSON(serialized); customer.deserializeCustomerAttributes(); assertEquals(attributes, customer.getCustomerAttributes()); }
4. Конвертер атрибутов
Если мы используем JPA 2.1 или выше , мы можем использовать Преобразователи атрибутов для оптимизации этого процесса.
Во-первых, мы создадим реализацию AttributeConverter . Мы будем повторно использовать наш код из предыдущих версий:
public class HashMapConverter implements AttributeConverter
Затем мы говорим Hibernate использовать наш новый AttributeConverter для поля Атрибуты клиента , и мы закончили:
@Convert(converter = HashMapConverter.class) private MapcustomerAttributes;
При таком подходе нам больше не нужно вручную вызывать методы сериализации и десериализации , так как Hibernate позаботится об этом за нас. Мы можем просто сохранить и получить объект Customer в обычном режиме.
5. Заключение
В этой статье мы рассмотрели несколько примеров сохранения объектов JSON с помощью Hibernate и Jackson.
В нашем первом примере рассматривался простой, совместимый метод, использующий пользовательские методы сериализации и десериализации. И во-вторых, мы представили Преобразователи атрибутов как мощный способ упростить наш код.
Как всегда, не забудьте проверить исходный код этого учебника на Github .