web-dev-qa-db-fra.com

Le moyen le plus rapide JPA d'ignorer un champ pendant la persistance?

Je recherche essentiellement une annotation de type "@ Ignore" avec laquelle je peux empêcher la persistance d'un champ particulier. Comment cela peut il etre accompli?

240
m2o

@Transient répond à vos besoins.

392
cletus

Pour ignorer un champ, annotez-le avec @Transient afin qu'il ne soit pas mappé par la mise en veille prolongée.

mais alors jackson ne sérialisera pas le champ lors de la conversion en JSON.

Si vous avez besoin de mélanger JPA avec JSON (omis par JPA mais toujours inclus dans Jackson), utilisez @JsonInclude :

_@JsonInclude()
@Transient
private String token;
_

CONSEIL:

Vous pouvez également utiliser JsonInclude.Include.NON_NULL et masquer les champs en JSON lors de la désérialisation lorsque _token == null_:

_@JsonInclude(JsonInclude.Include.NON_NULL)
@Transient
private String token;
_
93
Kamil Nekanowicz

Pour ignorer un champ, annotez-le avec @Transient afin qu'il ne soit pas mappé par la mise en veille prolongée.
Source: Annotations Hibernate .

22
Jonathan

Cette réponse arrive un peu en retard, mais elle complète la réponse.

Afin d'éviter qu'un champ d'une entité ne persiste dans la base de données, on peut utiliser l'un des deux mécanismes suivants:

@ Transient - L'annotation JPA indiquant qu'un champ n'est pas persistable

transitoire mot-clé en Java. Attention, l'utilisation de ce mot clé empêche l'utilisation du champ avec un mécanisme de sérialisation quelconque à partir de Java. Donc, si le champ doit être sérialisé, vous feriez mieux d'utiliser uniquement l'annotation @ Transient .

16
Olimpiu POP

Pour compléter les réponses ci-dessus, j'ai eu le cas d'utiliser un fichier de mappage XML dans lequel ni le @Transient ni le transient ne fonctionnaient pas ... Je devais mettre les informations transitoires dans le fichier xml:

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

Aucune des réponses ci-dessus n'a fonctionné pour moi avec Hibernate 5.2.10, Jersey 2.25.1 et Jackson 2.8.9. J'ai finalement trouvé la réponse (en quelque sorte, ils font référence à hibernate4module mais cela fonctionne pour 5 aussi) ici . Aucune des annotations Json n'a fonctionné avec @Transient. Apparemment, Jackson2 est suffisamment "intelligent" pour ignorer gentiment les éléments marqués de @Transient à moins que vous ne leur disiez explicitement de ne pas le faire. La clé consistait à ajouter le module hibernate5 (que j'utilisais pour traiter d'autres annotations Hibernate) et à désactiver la fonction USE_TRANSIENT_ANNOTATION dans mon application Jersey:

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

Voici la dépendance pour le module Hibernate5:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.8.9</version>
</dependency>
1
Hodglem