Que sont les objets détachés, persistants et transitoires en veille prolongée? Veuillez expliquer avec un exemple.
Que sont les objets détachés, persistants et transitoires en veille prolongée? Veuillez expliquer avec un exemple.
Réponses:
Une new
instance d'une classe persistante qui n'est pas associée à a Session
, n'a pas de représentation dans la base de données et aucune valeur d'identifiant n'est considérée comme transitoire par Hibernate:
Person person = new Person();
person.setName("Foobar");
// person is in a transient state
Une instance persistante a une représentation dans la base de données, une valeur d'identifiant et est associée à un Session
. Vous pouvez rendre une instance transitoire persistante en l'associant à un Session
:
Long id = (Long) session.save(person);
// person is now in a persistent state
Maintenant, si nous close
Hibernate Session
, l'instance persistante deviendra une instance détachée : elle n'est plus attachée à un Session
(mais peut toujours être modifiée et rattachée à une nouvelle Session
plus tard).
Tout cela est clairement expliqué dans tout le chapitre 10. Travailler avec des objets de la documentation Hibernate que je ne fais que paraphraser ci-dessus. Certainement, une lecture incontournable.
A persistent instance has a representation in the database
Une entité persistante n'a pas de représentation dans la base de données avant de valider l'opération de sauvegarde.
L'objet en veille prolongée a les états suivants:
Transient - Les objets instanciés à l'aide de l'opérateur new sont appelés objets transitoires.
Un objet est transitoire s'il vient d'être instancié à l'aide de l'opérateur new et qu'il n'est pas associé à une session Hibernate. Il n'a pas de représentation persistante dans la base de données et aucune valeur d'identifiant n'a été attribuée. Les instances transitoires seront détruites par le garbage collector si l'application ne contient plus de référence.
Persistant - Un objet auquel une identité de base de données est associée est appelé un objet persistant.
Une instance persistante a une représentation dans la base de données et une valeur d'identificateur. Il peut simplement avoir été enregistré ou chargé; cependant, c'est par définition dans le cadre d'une Session. Hibernate détectera toutes les modifications apportées à un objet dans un état persistant et synchronisera l'état avec la base de données une fois l'unité de travail terminée.
Détaché - Une instance détachée est un objet qui a été persistant, mais sa session a été fermée.
Une instance détachée peut être rattachée à une nouvelle session ultérieurement, ce qui la rend à nouveau persistante. Cette fonctionnalité permet un modèle de programmation pour les unités de travail de longue durée qui nécessitent un temps de réflexion de l'utilisateur. Nous les appelons des transactions applicatives, c'est-à-dire une unité de travail du point de vue de l'utilisateur.
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
Laissez-moi vous expliquer également le point de vue du garbage collector.
Il y a 3 états d'objet de hibernate (ou) Object Scope de hibernate-
Il vaut mieux comprendre avec un exemple de code-
Considérons une classe POJO comme objet étudiant->
Student student = new Student();
Maintenant, cet objet étudiant est à l'état transitoire .
Lorsque nous attachons cet objet POJO à la session d'hibernation->
session.save(student);
Cet objet POJO est maintenant à l'état persistant .
(Point de vue du garbage collector - GC ne peut pas effacer Tout objet qui est dans l'état persistant. Donc, nous pouvons dire que l'état persistant est comme le stockage temporaire pour les objets POJO )
Si nous exécutons->
session.beginTransaction.commit();
alors l'objet POJO est à l'état de stockage permanent ou de base de données
(Point de Garbage collector de vue- GC ne peut pas wipe-out cet objet car cet objet POJO est maintenant en dehors du champ d'application de machine virtuelle Java et stockée dans la table de forme dans un database.Soo on peut dire que cet état de stockage de base de données est comme le stockage permanent pour POJO objets )
Si nous exécutons->
session.evict(student);
alors l'objet POJO est expulsé ou retiré de l'état persistant à l'état détaché. Donc, cet état de l'objet POJO est l' état détaché .
(Point de vue du garbage collector - GC peut facilement effacer l'objet POJO d'état détaché de la JVM)
Compte tenu de l'entité suivante:
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
// other fields and methods.
}
À partir de la documentation Hibernate 5.2 (j'ai également inclus l' removed
état):
transitoire
l'entité vient d'être instanciée et n'est pas associée à un contexte de persistance. Il n'a pas de représentation persistante dans la base de données et généralement aucune valeur d'identifiant n'a été attribuée (sauf si le générateur affecté a été utilisé).
City city = new City();
géré ou persistant
l'entité a un identifiant associé et est associée à un contexte de persistance. Il peut exister physiquement ou pas encore dans la base de données.
// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate
// and reflected to the database when the persistence context is flushed.
session.save(city);
détaché
l'entité a un identifiant associé, mais n'est plus associée à un contexte de persistance (généralement parce que le contexte de persistance a été fermé ou que l'instance a été expulsée du contexte)
// city is in a detached state, Hibernate is no longer aware of the entity
session.evict(city)
enlevé
l'entité a un identifiant associé et est associée à un contexte de persistance, mais il est prévu de la supprimer de la base de données.
session.remove(city);
Remarque: l'
API Hibernate propose des couples de méthodes pour basculer entre les états d'entité, et je pense qu'il vaut la peine d'explorer une classe Hibernate Session .
A côté de la bonne réponse déjà identifiée persistante, transitoire, détachée sont juste l'état de l'objet en veille prolongée.
Pour être plus précis, ces trois états montrent en fait les changements d'objet de mise en veille prolongée et l'état du cycle de vie de la session