Que sont les objets détachés, persistants et transitoires en veille prolongée?

100

Que sont les objets détachés, persistants et transitoires en veille prolongée? Veuillez expliquer avec un exemple.

Jigar Joshi
la source
lors de la session.close ne supprimera-t-il pas tous les objets qui étaient de la persistance dans la portée de la session?
Jigar Joshi
Oui, il sera supprimé, donc chaque fois que vous fermez une session, l'état persistant d'un objet est converti en état Détaché.
Rachel le
@Rachel beau lien fourni avec du code pour une compréhension plus profonde
Priyank Thakkar

Réponses:

161

Une newinstance 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 closeHibernate 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 Sessionplus 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.

Pascal Thivent
la source
Une valeur d'identifiant n'est probablement pas une condition stricte pour qu'un objet soit persistant puisque je pourrais utiliser la stratégie de génération d'identifiant assigné.
Abhijeet Kashnia
En plus de fermer la session qui a lu dans l'instance, on peut détacher une instance en appelant session.evict (). Cela l'empêche d'être géré par Hibernate (évite ainsi que les modifications apportées à l'instance soient automatiquement propagées vers la base de données). Vous pouvez envoyer les modifications à la base de données via session.update () et la rattacher avec session.merge ().
Mooshu
1
Souvent, nous ne suivons pas les documents originaux fournis par les frameworks .. qui parfois eux-mêmes ont des informations cachées avec une description appropriée juste besoin d'explorer. le seul problème est que nous ne le trouvons pas facilement :)
agpt
A persistent instance has a representation in the databaseUne entité persistante n'a pas de représentation dans la base de données avant de valider l'opération de sauvegarde.
O.Badr
1
Donc, la différence d'entité détachée et transitoire est la présence d'un ID ? Si je crée une nouvelle instance avec un identifiant attribué, alors formellement, elle est transitoire, car elle n'est pas encore persistante, mais ne peut pas être distinguée de détachée, car elle a un identifiant. Droite?
Ruslan Stelmachenko
9

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

Sk Sharma
la source
5

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-

  1. État transitoire
  2. état persistant
  3. état détaché

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)

Sabunkar Tejas Sahailesh
la source
2

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 .

O.Badr
la source
0

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

Amol Dixit
la source