2012-10-16 21 views
7

Czy istnieje sposób, aby zachować LAZY ładowanie i deserializować obiekt za pomocą id zamiast POJO obiektu.deserialize leniwy ładowanie w hibernacji i jackson

Mam 2 klasy, które są połączone relacją wiele do wielu.

coś takiego

public class User { 
    @Id 
    @JsonProperty 
    public long id; 

    @ManyToMany(
      fetch = FetchType.EAGER, 
    ) 
    @JoinTable(
      name = "User_EntityType", 
      joinColumns = @JoinColumn(name = "user_id"), 
      inverseJoinColumns = @JoinColumn(name = "type_id") 
    ) 
    @JsonProperty 
    public Set<Type> types; 

} 

public class Type { 
    @Id 
    @JsonProperty 
    public long id; 

    @ManyToMany(
      fetch = FetchType.EAGER, 
      mappedBy = "types", 
      targetEntity = User.class 
    ) 
    @JsonProperty 
    public Set<User> users; 
} 

typu dane działa dobrze. Mogę pisać i czytać przy użyciu hibernacji bez problemu.

Jednak chcę móc zwrócić obiekt użytkownika z interfejsem API REST, więc używam go do deserializacji. Problem polega na tym, że robię to, deserializuję każdy obiekt typu w obiekcie użytkownika, który zawiera inne obiekty typu, i powoduje ogromny bałagan.

Czy można zamiast tego zwrócić zestaw identyfikatorów typu długiego zamiast zestawu typów?

Odpowiedz

4

Tak, jest możliwe, jeśli używasz Jackson 2.0, z funkcją Object Identity.

Jeśli dodasz adnotację do klasy za pomocą adnotacji @JsonIdentityInfo, to Jackson wypisze obiekt tylko raz; kolejne odniesienia będą używać ID zamiast tego. Twój zestaw typów będzie serializowany jako identyfikatory, o ile typy zostały wypisane jeden raz. Podczas deserializacji Jackson zmieni identyfikatory z powrotem w obiekty.

W twoim przypadku myślę, że trzeba by opisywać swoją klasę typ tak:

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class Type { 
    ... 
} 

Zobacz http://wiki.fasterxml.com/JacksonFeatureObjectIdentity Szczegółowe informacje na temat korzystania z tej funkcji.

0

Wystąpiłem również w tym problemie w moich punktach końcowych JAX-RS, które muszą serializować i serwować elementy hibernacji za pomocą mappers obiektów Jackson. Opcja użycia rozwiązań takich jak @JsonIgnore lub @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,... nie była dla mnie opcją, ponieważ pierwsze oznaczałoby, że pole relacyjne zostanie pominięte w wynikach zserializowanych, a późniejsze metody nie rozwiązały problemu bez względu na wszystko.

Więc moje rozwiązanie było ustawić następującą flagę na odwzorowującego przed robi rzeczywistego serializacji:

ObjectMapper objMapper = new ObjectMapper(); 
objMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 

ten sposób, nie było próbą wypełnienia relacyjnych obiektów, zamiast ich identyfikatory pozostały nienaruszone, i dlatego mogłem zachować flagę fetch = FetchType.LAZY na moich polach relacyjnych.

Powiązane problemy