usage tutorial jsonidentityinfo jsonbackreference hibernate5 datatype java hibernate jackson

java - tutorial - deserializar la carga lenta en Hibernate y Jackson



java jackson circular reference (2)

Sí, es posible, si usa Jackson 2.0, con la función Identidad del objeto.

Si anota una clase con la anotación @JsonIdentityInfo , Jackson solo generará el objeto una vez; las referencias posteriores usarán el ID en su lugar. Por lo tanto, su conjunto de tipos se serializará como ID, siempre que los tipos se hayan emitido una vez. Al deserializar, Jackson convertirá los ID en objetos.

En tu caso, creo que necesitarías anotar tu clase Type de la siguiente manera:

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

Consulte http://wiki.fasterxml.com/JacksonFeatureObjectIdentity para obtener detalles sobre cómo usar esta característica.

¿Hay alguna manera de mantener LAZY cargando y deserializando el objeto usando el id en lugar del objeto POJO?

Tengo 2 clases que están unidas por una relación de muchos a muchos.

Algo como esto

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; }

El tipo de datos funciona bien. Puedo escribir y leer usando Hibernate sin problemas.

Sin embargo, quiero poder devolver un objeto Usuario con una API REST, así que estoy usando Jackson para deserializarlo. El problema es cuando hago eso, deserializo cada Tipo en el objeto Usuario, que incluye otros objetos Tipo, y crea un gran desorden.

¿Es posible simplemente devolver el conjunto de ID de tipo largo en lugar de establecer el tipo?


También me enfrentaba a este problema en mis puntos finales JAX-RS, que tienen que serializar y servir a las entidades de Hibernate utilizando los mapeadores de objetos de Jackson. La opción de usar soluciones como @JsonIgnore o @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,... no era una opción para mí, ya que lo primero significaría que el campo relacional se omite de la salida serializada, y el método posterior tipo de fallo para resolver el problema pase lo que pase.

Entonces, mi solución fue establecer la siguiente bandera en el mapeador antes de hacer la serialización real:

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

De esta forma, no hubo ningún intento de poblar objetos relacionales, en cambio sus identificadores se dejaron intactos, y así pude mantener el indicador fetch = FetchType.LAZY en mis campos relacionales.