2009-08-15 10 views

risposta

310

@Transient conforme alle vostre esigenze.

+10

Ma poi jackson non serializzerà il campo durante la conversione in JSON ... come risolvere? – MobileMon

+0

che dipende dalla tua app desing.se annoti la tua classe di entità - si applica ovunque; ma se si usa il dao che usa l'entità, è un'altra storia. in breve: utilizzare DAO quando si dispone di più depositi – Sarief

+0

@MobileMon controllare la mia risposta di seguito su jackson – user3871754

18

Per ignorare un campo, annotarlo con @Transient in modo che non venga mappato dalla modalità di sospensione.
Fonte: Hibernate Annotations.

14

Questa risposta arriva un po 'in ritardo, ma completa la risposta.

Per evitare un campo da un organismo di essere mantenuta nel DB si può utilizzare uno dei due meccanismi:

@Transient - l'annotazione JPA marcatura un campo non Persistable

transient parola in java. Attenzione: l'uso di questa parola chiave impedirà l'utilizzo del campo con qualsiasi meccanismo di serializzazione da java. Pertanto, se il campo deve essere serializzato, è preferibile utilizzare solo l'annotazione @Transient.

+0

che ne dici di voler solo ignorare la persistenza sul metodo get ?. Ad esempio: myjparepository.save() salverà il modello come al solito e myjparepository.find (id) ignorerà il campo che voglio? – xtiger

+0

non ho idea se è possibile. Scusa –

2

Per completare le risposte di cui sopra, ho avuto il caso utilizzando un file di mapping XML in cui né il @Transienttransient lavorato ... ho dovuto mettere l'informazione transitoria nel file XML:

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

Per ignora un campo, annotalo con @Transient in modo che non venga mappato da ibernazione.

ma poi jackson non serializzerà il campo durante la conversione in JSON.

Se avete bisogno di mescolare JPA con JSON (omettere dalla APP, ma ancora comprendere a Jackson) utilizza @JsonInclude:

@JsonInclude() 
@Transient 
private String token; 

È anche possibile utilizzare JsonInclude.Include.NON_NULL e nascondere campi in JSON durante la deserializzazione quando token == null:

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

Sto eseguendo JAX-RS 2.0.1/Jersey 2.25.1/Jackson 2.8.7 e con quello stack '@ JsonInclude' non è necessario: i campi' @ Transient' sono ancora inclusi in JSON. (Hai ancora ottenuto il mio voto: la tecnica stessa potrebbe essere molto utile in altre circostanze). – DKroot

1

Nessuna delle risposte di cui sopra ha funzionato per me utilizzando Hibernate 5.2.10, Jersey 2.25.1 e Jackson 2.8.9. Alla fine ho trovato la risposta (sorta di riferimento a hibernate4module ma funziona anche per 5) here. Nessuna delle annotazioni Json ha funzionato affatto con @Transient. Apparentemente Jackson2 è abbastanza "intelligente" da ignorare gentilmente le cose contrassegnate con @Transient a meno che tu non le dica esplicitamente di farlo. La chiave è stato quello di aggiungere il modulo hibernate5 (che usavo a che fare con altre annotazioni Hibernate) e disattivare la funzione USE_TRANSIENT_ANNOTATION nella mia applicazione Jersey:

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

Ecco la dipendenza per il Hibernate5Module:

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

Dopo aver provato ogni altro metodo di parlare sopra e altri '@ JsonProperty' ' @ JsonInclude' '@JsonSerialize + @ JsonDeserialize'' mapper.configure (MapperFeature.PROPAGATE_TRANSIENT_MARKER, false)); ' questa soluzione alla fine ha funzionato. Grazie! – Aceonline

Problemi correlati