2015-09-02 2 views
1

У меня есть два объекта: Order и Item в OneToMany отношениях. Элемент принадлежит Ордену, а в Ордене есть набор предметов.Как исключить поля во время сериализации gson

class Order{ 
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "id_order") 
    Set<Item> items; 
} 

class Item{ 
    @ManyToOne(targetEntity = Order.class, fetch = FetchType.LAZY) 
    @JoinColumn(name = "id_order") 
    Order id_order; 
} 

Я использую gson сериализовать Orders и отправить их на другую машину, но петля создается во время сериализации, как за счет заказов и предметов, имеющих ссылки друг на друга.

Моя цель заключается в том, что при загрузке Item поле id_order должно быть либо null, либо содержать только идентификатор, чтобы избежать распространения. Поддерживает ли hibernate эту функцию? Или я могу исключить поле во время сериализации?

Я уже пытался FetchType.LAZY на Item и ловить Item внутри onLoad() Interceptor и установив его id_order в null. Но это не сработало. Я пытаюсь избежать написания пользовательского адаптера или вручную разбора всех элементов внутри всех ордеров при каждом запросе.

ответ

3

Я считаю, что это не так много с Hibernate, но больше с GSON. Вы должны определить правило сериализации/десериализации.

Самый простой способ заключается в использовании @Expose аннотацию, чтобы включить/исключить данное свойство из сериализации/десериализации:

@Expose(serialize = false, deserialize = false) 

Другой способ заключается в определении пользовательских адаптеров для givem класса. WIth Adapter вы можете полностью переопределить способ сериализации или десериализации объекта GSON.

Например:

public class YourAdapter implements JsonDeserializer<Order>, JsonSerializer<Order> { 
    @Override 
    public Orderde serialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { 
    // your logic 
    } 

    @Override 
    public JsonElement serialize(Ordersrc, Type typeOfSrc, JsonSerializationContext context) { 
     // your logic 
    } 
} 

Наконец инициализировать экземпляр вашего Gson парсера:

Gson gson = new GsonBuilder() 
     .registerTypeAdapter(Order.class, new YourAdapter()) 
     .build(); 

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

Другой способ решения проблемы сериализации/десериализации является использование ExclusionStrategy описано здесь: https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/ExclusionStrategy.html

+0

Кажется '@ Expose' является то, что я хочу, однако, это требует' @ excludeFieldsWithoutExposeAnnotation', и что требует от меня, чтобы добавить @Выполните все поля всех объектов (которых много). Есть ли способ автоматического экспонирования всех полей, кроме тех, кого я указываю serialize = false? –

+0

Да, вы можете использовать ExclusionStrategy: https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/ExclusionStrategy.html – kamil

+0

Я прибегал к ExclusionStrategy. Прост в использовании и очень практичен. Спасибо, пожалуйста, добавьте его в ответ для будущих читателей. –