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?
281
@Transient
répond à vos besoins.
Pour ignorer un champ, annotez-le avec
@Transient
afin qu'il ne soit pas mappé en hibernation.mais 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
:POINTE:
Vous pouvez également utiliser JsonInclude.Include.NON_NULL et masquer les champs dans JSON pendant la désérialisation lorsque
token == null
:la source
@JsonInclude
n'est pas nécessaire: les@Transient
champs sont toujours inclus dans JSON. (Vous avez quand même obtenu mon vote: la technique elle-même pourrait être très utile dans d'autres circonstances).Pour ignorer un champ, annotez-le avec
@Transient
afin qu'il ne soit pas mappé en hibernation.Source: Hibernate Annotations .
la source
Cette réponse arrive un peu tard, 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:
@Transient - l'annotation JPA marquant un champ comme non persistant
mot-clé transitoire en java. Attention - l'utilisation de ce mot-clé empêchera le champ d'être utilisé avec tout mécanisme de sérialisation de java. Donc, si le champ doit être sérialisé, vous feriez mieux d'utiliser uniquement l'annotation @Transient .
la source
Il existe plusieurs solutions selon le type d'attribut d'entité.
Attributs de base
Considérez que vous avez le
account
tableau suivant :Le
account
tableau est mappé à l'Account
entité comme ceci:Les attributs des entités de base sont mis en correspondance avec des colonnes de table, donc des propriétés telles que
id
,iban
,cents
sont des attributs de base.Mais
dollars
,interestCents
etinterestDollars
sont des propriétés calculées, afin que vous les annoter avec@Transient
les exclure de SELECT, INSERT, UPDATE et DELETE SQL.Les associations
En supposant que vous disposez des éléments suivants
post
et despost_comment
tableaux:Vous souhaitez mapper l'
lastestComment
association dans l'Post
entité à la dernièrePostComment
entité ajoutée.Pour ce faire, vous pouvez utiliser l'
@JoinFormula
annotation:Lors de la récupération de l'
Post
entité, vous pouvez voir que lelatestComment
est récupéré, mais si vous souhaitez le modifier, le changement va être ignoré.@MapsId
Une autre façon d'ignorer les associations déjà mappées par l'identifiant d'entité est d'utiliser
@MapsId
.Par exemple, considérez la relation de table un-à-un suivante:
L'
PostDetails
entité est mappée comme ceci:Notez que l'
id
attribut et l'post
association mappent la même colonne de base de données, qui est lapost_details
colonne Clé primaire.Pour exclure l'
id
attribut, l'@MapsId
annotation indiquera à Hibernate que l'post
association prend en charge la valeur de la colonne Clé primaire de la table.En utilisant
insertable = false, updatable = false
Une autre option consiste à utiliser
insertable = false, updatable = false
pour l'association que vous souhaitez ignorer par Hibernate.Par exemple, nous pouvons mapper l'association biunivoque précédente comme ceci:
Les attributs
insertable
etupdatable
de l'@JoinColumn
annotation indiqueront à Hibernate d'ignorer l'post
association car l'identifiant d'entité prend en charge lapost_id
colonne Clé primaire.la source
post
etpost_details
comme exemple?Pour compléter les réponses ci-dessus, j'ai eu le cas en utilisant un fichier de mappage XML où ni le
@Transient
ni netransient
fonctionnait ... J'ai dû mettre les informations transitoires dans le fichier xml:la source
Aucune des réponses ci-dessus n'a fonctionné pour moi en utilisant 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 aussi pour 5) ici . Aucune des annotations Json n'a fonctionné du tout
@Transient
. Apparemment, Jackson2 est suffisamment «intelligent» pour ignorer les choses marquées par, à@Transient
moins que vous ne le lui disiez explicitement. La clé était d'ajouter le module hibernate5 (que j'utilisais pour gérer d'autres annotations Hibernate) et de désactiver laUSE_TRANSIENT_ANNOTATION
fonctionnalité dans mon application Jersey:Voici la dépendance du Hibernate5Module:
la source
@JsonProperty
@JsonInclude
@JsonSerialize + @JsonDeserialize
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));
cette solution a finalement fonctionné. Merci!Parfois, vous voulez:
Utilisation
@Column(name = "columnName", insertable = false, updatable = false)
Un bon scénario est lorsqu'une certaine colonne est automatiquement calculée en utilisant d'autres valeurs de colonne
la source