Как сохранить сущность как Json в MySql? - PullRequest
0 голосов
/ 13 марта 2019

Я использую spring и hibernate для сохранения @Entity классов в базе данных mysql.

Для одного атрибута я хочу сохранить объект как поле String или Json, а не создавать дополнительную таблицу и использовать @OneToOne сопоставления ссылок или аналогичные.

В качестве примера возьмем следующее:

@Entity
public class Customer {

    //@JsonObject
    private List<Address> address;
}

public class Address {
    private String street, number, city, zip, country;
}

Вопрос: как я могу указать hibernate автоматически сохранить этот адрес как string / json? И, конечно же, при чтении строки / json следует переназначить в объект Address.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

На данный момент я могу решить это с AttributesConverter. Приятно, что Spring может автоматически добавить в него картограф Джексона:

@Entity
public class Customer {
    @Convert(converter = AddressConverter.class)
    @Lob
    @Column(columnDefinition = "text")
    private List<Address> address;
}

@Converter
public class AddressConverter implements AttributeConverter<List<Address>, String> {
    private ObjectMapper objectMapper;

    @Autowired //injected by spring
    public AddressConverter(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Override
    public String convertToDatabaseColumn(List<AddressConverter> list) {
        try {
            if (!CollectionUtils.isEmpty(list))
                return objectMapper.writeValueAsString(list);
        } catch (final JsonProcessingException e) {
            LOGGER.error(e);
        }

        return null;
    }

    @Override
    public List<Address> convertToEntityAttribute(String json) {
        try {
            if (StringUtils.isNotBlank(json))
                return objectMapper.readValue(json, List.class);
        } catch (final IOException e) {
            LOGGER.error(e);
        }

        return null;
    }
}
0 голосов
/ 13 марта 2019

Вы можете хранить jsons в таблицах mySQL:

CREATE TABLE `book` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(200) NOT NULL,
  `tags` json DEFAULT NULL,
  PRIMARY KEY (`id`)
)

Вставить запрос:

INSERT INTO `book` (`title`, `tags`)
VALUES (
  'ECMAScript 2015: A SitePoint Anthology',
  '["JavaScript", "ES2015", "JSON"]'
);

В hibernate вы должны создать класс (например, "com.test.MyJsonType"), которыйдолжен реализовывать org.hibernate.usertype.Интерфейс UserType, в котором метод nullSafeGet должен десериализовать JSON для объекта Java (используя Джексона), nullSafeSet сериализует POJO в JSON и некоторые другие вспомогательные методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...