2015-06-17 2 views
1

У меня есть два объекта X и Y с отношением @ManyToMany. X имеет список Y, назовем его yList. И X, и Y имеют и другие члены класса (они не важны).Deserializing json и разрешающие объекты JPA

Я использую Hibernate как поставщик JPA, а также джексон-databind/jackson-аннотации для thinkgs, таких как сериализация и десериализация.

Теперь от клиента получен следующий json. Он имеет все поля X, но только список идентификаторов для Y. В качестве конкретного примера X может быть Person и Y может быть Country. И отношение «многие ко многим» фиксирует, какие страны были посещены кем.

{ 
    name: 'Bob Dylan', 
    age: '74', 
    visitedCountryIds: ['45', '23', '85'] 
} 

Когда десериализации этого JSON, я хочу, чтобы заполнить все поля в сущности X, в том числе, например Мастер стилей, что элементы разрешаются Мастер стилей, просматривая эти объекты в базе данных.

Моя идея заключается в десериализации yList путем написания пользовательского подкласса JsonDeserializer и его выполнения поиска по id.

Это разумный подход?

ответ

1

Вы можете использовать @JsonCreator (как уже было предложено Uri Shalit) или только метод setter для вашего объекта, в котором вы будете делать необходимые поисковые запросы из базы данных.

Однако, если у вас есть много объектов (и ассоциаций), для которых вы хотите это сделать, тогда это может быть повторный шаблонный код. Кроме того, если они будут реализованы непосредственно в классах сущностей, они будут загрязнять их кодом поиска базы данных (читаемость, SRP и т. Д.).

Если вам нужен общий подход к этому, то я думаю, что вы на хорошем пути; Пользовательский десериализатор - это место для его реализации.

Если бы я использовал универсальный подход, я бы, вероятно, представил пользовательскую аннотацию, которую я бы поставил в определении ассоциации вместе со стандартными аннотациями JPA. Например:

@MyCustomJsonIds("visitedCountryIds") 
@ManyToMany(...) 
private List<Country> countries; 

Затем в десериализатор, я бы запрос на наличие этих аннотаций динамически определить, что нужно смотреть вверх из базы данных.

2

Другим вариантом является создание конструктора, который принимает эти параметры, аннотирует его @JsonCreator и имеет конструктор, выполняющий поиск из базы данных, поэтому вам не нужно писать конкретный десериализатор.

Смежные вопросы