2009-08-15 8 views

Respuesta

310

@Transient cumple con sus necesidades.

+10

Pero entonces, Jackson no serializará el campo al convertir a JSON ... ¿cómo resolverlo? – MobileMon

+0

que depende del diseño de tu aplicación.si anota su clase de entidad, se aplica a todas partes; pero si anotas esa entidad de uso, es otra historia. en resumen: use DAO cuando tenga múltiples almacenamientos – Sarief

+0

@MobileMon verifique mi respuesta a continuación sobre jackson – user3871754

14

Esta respuesta llega un poco tarde, pero completa la respuesta.

el fin de evitar un campo de una entidad que se persistieron en DB se puede utilizar uno de los dos mecanismos:

@Transient - la anotación JPA marcando un campo como no con persistencia

transient palabra clave en java Tenga cuidado: el uso de esta palabra clave evitará que el campo se use con cualquier mecanismo de serialización de Java. Por lo tanto, si el campo debe ser serializado, será mejor que utilice solo la anotación @ Transient.

+0

¿Qué tal si solo quiero ignorar la persistencia en el método get ?. Por ejemplo: myjparepository.save() guardará el modelo como de costumbre, y myjparepository.find (id) ignorará el campo que yo quiero? – xtiger

+0

ni idea si eso es posible. Lo siento –

2

Para completar las respuestas anteriores, que tenía el caso mediante un archivo de asignación XML donde ni el @Transient ni transient trabajaron ... que tenía que poner la información transitoria en el archivo xml:

<attributes> 
(...) 
    <transient name="field" /> 
</attributes> 
40

Para ignore un campo, anótelo con @Transient para que hibernate no lo correlacione.

pero luego jackson no serializará el campo al convertir a JSON.

Si necesita mezclar JPA con JSON (omita por la APP pero todavía incluir en Jackson) utiliza @JsonInclude:

@JsonInclude() 
@Transient 
private String token; 

También puede utilizar JsonInclude.Include.NON_NULL y ocultar campos en JSON durante la deserialización cuando token == null:

@JsonInclude(JsonInclude.Include.NON_NULL) 
@Transient 
private String token; 
+1

Estoy ejecutando JAX-RS 2.0.1/Jersey 2.25.1/Jackson 2.8.7 y con esa pila '@ JsonInclude' no es necesario:' @ Transient' campos todavía se incluyen en JSON. (Todavía tienes mi voto: la técnica en sí misma podría ser muy útil en otras circunstancias). – DKroot

1

Ninguna de las respuestas anteriores funcionó para mí usando Hibernate 5.2.10, Jersey 2.25.1 y Jackson 2.8.9. Finalmente encontré la respuesta (más o menos, hacen referencia a hibernate4module pero también funciona para 5) here. Ninguna de las anotaciones de Json funcionó en absoluto con @Transient. Aparentemente Jackson2 es lo suficientemente "inteligente" como para ignorar amablemente las cosas marcadas con @Transient a menos que explícitamente le diga que no lo haga. La clave fue la de añadir el módulo hibernate5 (que yo estaba usando para hacer frente a otras anotaciones de Hibernate) y desactivar la función de USE_TRANSIENT_ANNOTATION en mi Aplicación Jersey:

ObjectMapper jacksonObjectMapper = new ObjectMapper(); 
Hibernate5Module jacksonHibernateModule = new Hibernate5Module(); 
jacksonHibernateModule.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION); 
jacksonObjectMapper.registerModule(jacksonHibernateModule); 

Aquí es la dependencia para el Hibernate5Module:

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-hibernate5</artifactId> 
    <version>2.8.9</version> 
</dependency> 
+0

Después de probar todos los demás métodos mencionó anteriormente y otras '@ JsonProperty' ' '@ JsonInclude' @JsonSerialize + @ JsonDeserialize'' mapper.configure (MapperFeature.PROPAGATE_TRANSIENT_MARKER, false)); ' esta solución finalmente funcionó. ¡Gracias! – Aceonline

Cuestiones relacionadas