Сохраните значение поля в БД, используя Spring Data JPA, тип данных которого может отличаться - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть требование, при котором некоторые известные данные вместе с неизвестными данными поступают со входа JSON. У меня есть несколько атрибутов, тип данных которых известен, но может быть несколько атрибутов, тип которых будет неизвестен. Ниже представлен объект модели @RequestBody, используемый для отображения JSON input

class User {

private final Map<String, Object> additionalAttributes = new HashMap<>();

@NotBlank
private String name;
private String city;
private Integer age;

@JsonAnySetter
public void addDetail(String key, Object value) {
  this.additionalAttributes.put(key, value);
}

public Map<String, Object> getAdditionalAttributes() { 

                return this.additionalAttributes; 
     }

}

И ниже - input JSON

{
   "name": "abc",
   "city": "xyz",
   "age":  25,
   "zip":765234,
   "country": "india",
   "NRI" false
}

В приведенном выше примере тип данных ' имя ',' город 'и' возраст 'известны API и, соответственно, они объявлены. Но дополнительные атрибуты (zip, country и NRI) и их значения, которые будут доступны в виде пары ключ-значение на карте, будут нам неизвестны. Поскольку дополнительные атрибуты отображаются на карту, значение может быть любым. В приведенном выше примере JSON значение zip - целое число / длинное, страна - строка, а NRI - логическое.

Теперь для обязательных атрибутов у меня написан класс сущности, так как я знаю имя и тип данных. Эти атрибуты будут храниться в таблице, скажем, 'обязательная_таблица'.

Для необязательных атрибутов (которые мы получаем в качестве пары ключ-значение на карте), у меня может быть новая таблица, называемая "дополнительные_атрибуты" с тремя столбцами, а именно «attributeName», «attributeValue» и «m_id», которые будут внешним ключом для «обязательной_таблицы».

Проблема, с которой я здесь сталкиваюсь, заключается в том, что, поскольку значением атрибута может быть все, что пользователь может передать в качестве ввода JSON, как мне заполнить столбец attributeValue? Для атрибута attributeName проблем нет, поскольку ключ всегда будет String.

@Entity(name = "additional_attributes")
class AdditionalAttributes {

      private String attributeName;
      private Object attributevalue;

      // getter and setter
      // manytoone with mandatory table
  }

Мне нужно сохранить тип данных attributeValue как Object, поскольку полученное из карты значение будет иметь тип Object.

...