Java a le transient
mot - clé. Pourquoi JPA a-t-il @Transient
au lieu d'utiliser simplement le mot-clé java déjà existant?
283
Java a le transient
mot - clé. Pourquoi JPA a-t-il @Transient
au lieu d'utiliser simplement le mot-clé java déjà existant?
Le transient
mot - clé Java est utilisé pour indiquer qu'un champ ne doit pas être sérialisé, tandis que l' @Transient
annotation JPA est utilisée pour indiquer qu'un champ ne doit pas être conservé dans la base de données, c'est-à-dire que leur sémantique est différente.
Parce qu'ils ont des significations différentes. L'
@Transient
annotation indique au fournisseur JPA de ne conserver aucuntransient
attribut (non ). L'autre indique au framework de sérialisation de ne pas sérialiser un attribut. Vous voudrez peut-être avoir une@Transient
propriété et toujours la sérialiser.la source
Comme d'autres l'ont dit,
@Transient
est utilisé pour marquer des champs qui ne doivent pas être conservés. Considérez ce court exemple:Lorsque cette classe est envoyée à la JPA, elle persiste
gender
etid
n'essaie pas de persister les méthodes booléennes auxiliaires - sans que@Transient
le système sous-jacent ne se plaigne que la classe EntityPerson
est manquantesetMale()
et que lessetFemale()
méthodes ne persisteraient donc pasPerson
du tout.la source
Le but est différent:
Le
transient
mot-clé et l'@Transient
annotation ont deux objectifs différents: l'un traite de la sérialisation et l'autre de la persistance . En tant que programmeurs, nous marions souvent ces deux concepts en un seul, mais ce n'est pas exact en général. La persistance se réfère à la caractéristique de l'État qui survit au processus qui l'a créé. La sérialisation en Java fait référence au processus de codage / décodage de l'état d'un objet en tant que flux d'octets.Le
transient
mot-clé est une condition plus solide que@Transient
:Si un champ utilise le
transient
mot clé, ce champ ne sera pas sérialisé lorsque l'objet est converti en un flux d'octets. De plus, étant donné que JPA traite les champs marqués avec letransient
mot - clé comme ayant l'@Transient
annotation, le champ ne sera pas non plus conservé par JPA.En revanche, les champs annotés
@Transient
seuls seront convertis en un flux d'octets lorsque l'objet est sérialisé, mais il ne sera pas conservé par JPA. Par conséquent, letransient
mot clé est une condition plus forte que l'@Transient
annotation.Exemple
Cela soulève la question: pourquoi quelqu'un voudrait-il sérialiser un champ qui n'est pas conservé dans la base de données de l'application? La réalité est que la sérialisation est utilisée pour plus que de la persistance . Dans une application Enterprise Java, il doit y avoir un mécanisme pour échanger des objets entre les composants distribués ; la sérialisation fournit un protocole de communication commun pour gérer cela. Ainsi, un champ peut contenir des informations critiques à des fins de communication entre composants; mais ce même champ peut n'avoir aucune valeur du point de vue de la persistance.
Par exemple, supposons qu'un algorithme d'optimisation soit exécuté sur un serveur et supposons que cet algorithme prenne plusieurs heures. Pour un client, disposer de l'ensemble de solutions le plus à jour est important. Ainsi, un client peut s'abonner au serveur et recevoir des mises à jour périodiques pendant la phase d'exécution de l'algorithme. Ces mises à jour sont fournies à l'aide de l'
ProgressReport
objet:La
Solution
classe pourrait ressembler à ceci:Le serveur persiste chacun
ProgressReport
dans sa base de données. Le serveur ne tient pas à persisterestimatedMinutesRemaining
, mais le client se soucie certainement de ces informations. Par conséquent, leestimatedMinutesRemaining
est annoté à l'aide de@Transient
. Lorsque la finaleSolution
est localisée par l'algorithme, elle est conservée directement par JPA sans utiliser aProgressReport
.la source
@Unpersisted
.@Ephemeral
. Selon Merriam Webster: Quand l'éphémère a été imprimé pour la première fois en anglais dans les années 1600, "c'était un terme scientifique appliqué aux fièvres à court terme, et plus tard, aux organismes (tels que les insectes et les fleurs) avec des durées de vie très courtes. , il a acquis un sens étendu se référant à tout ce qui est éphémère et éphémère (comme dans les "plaisirs éphémères"). "transient
champs comme ayant implicitement l'@Transient
annotation. Donc, si vous utilisez letransient
mot - clé pour empêcher la sérialisation d'un champ, il ne se retrouvera pas non plus dans la base de données.Si vous voulez juste qu'un champ ne persiste pas, les deux transitoires et @Transient fonctionnent. Mais la question est de savoir pourquoi @Transient car transitoire existe déjà.
Parce que le champ @Transient sera toujours sérialisé!
Supposons que vous créez une entité, en faisant des calculs consommant beaucoup de CPU pour obtenir un résultat et ce résultat ne sera pas enregistré dans la base de données. Mais si vous souhaitez envoyer l'entité à d'autres applications Java à utiliser par JMS, vous devez utiliser
@Transient
, pas le mot clé JavaSEtransient
. Ainsi, les récepteurs fonctionnant sur d'autres machines virtuelles peuvent gagner du temps pour recalculer à nouveau.la source
Je vais essayer de répondre à la question du "pourquoi". Imaginez une situation où vous avez une énorme base de données avec beaucoup de colonnes dans une table, et votre projet / système utilise des outils pour générer des entités à partir de la base de données. (Hibernate en a, etc ...) Maintenant, supposons que selon votre logique métier, vous avez besoin qu'un champ particulier ne soit PAS persisté. Vous devez "configurer" votre entité d'une manière particulière. Alors que le mot-clé Transient fonctionne sur un objet - car il se comporte dans un langage java, le @Transient est uniquement conçu pour répondre aux tâches qui ne concernent que les tâches de persistance.
la source