Réponses:
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 aucun transient
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.
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:
public enum Gender { MALE, FEMALE, UNKNOWN }
@Entity
public Person {
private Gender g;
private long id;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public Gender getGender() { return g; }
public void setGender(Gender g) { this.g = g; }
@Transient
public boolean isMale() {
return Gender.MALE.equals(g);
}
@Transient
public boolean isFemale() {
return Gender.FEMALE.equals(g);
}
}
Lorsque cette classe est envoyée à la JPA, elle persiste gender
et id
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 Entity Person
est manquante setMale()
et que les setFemale()
méthodes ne persisteraient donc pas Person
du tout.
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 le transient
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, le transient
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:
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
La Solution
classe pourrait ressembler à ceci:
@Entity
public class Solution implements Serializable{
private static final long serialVersionUID = 1L;
double[][] dataArray;
Properties properties;
}
Le serveur persiste chacun ProgressReport
dans sa base de données. Le serveur ne tient pas à persister estimatedMinutesRemaining
, mais le client se soucie certainement de ces informations. Par conséquent, le estimatedMinutesRemaining
est annoté à l'aide de @Transient
. Lorsque la finale Solution
est localisée par l'algorithme, elle est conservée directement par JPA sans utiliser a ProgressReport
.
@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 le transient
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é JavaSE transient
. Ainsi, les récepteurs fonctionnant sur d'autres machines virtuelles peuvent gagner du temps pour recalculer à nouveau.
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.