web-dev-qa-db-fra.com

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

Que sont les objets détachés, persistants et transitoires en veille prolongée? S'il vous plaît expliquer avec un exemple.

85
Jigar Joshi

Une instance new d'une classe persistante qui n'est pas associée à une Session, n'a aucune représentation dans la base de données et aucune valeur d'identificateur 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'identificateur et est associée à une Session. Vous pouvez créer une instance transitoire persistante en l'associant à une Session:

Long id = (Long) session.save(person);
// person is now in a persistent state

Maintenant, si nous close la Hibernate Session, l'instance persistante deviendra une instance détachée: elle ne sera plus attachée à une Session (mais pourra toujours être modifiée et rattachée à une nouvelle Session bien que).

Tout ceci est clairement expliqué dans l'ensemble Chapitre 10. Travailler avec des objets de la documentation d'Hibernate que je ne fais que paraphraser ci-dessus. Certainement, un must-read.

144
Pascal Thivent

L'objet en veille prolongée a les états suivants:

Transitoire - Les objets instanciés à l'aide du nouvel opérateur sont appelés objets transitoires.

Un objet est transitoire s'il vient d'être instancié à l'aide du nouvel opérateur et s'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'identificateur n'a été attribuée. Les instances transitoires seront détruites par le ramasse-miettes 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. Cela vient peut-être d'être sauvegardé ou chargé; Cependant, il 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 cet état avec la base de données à la fin de l'unité de travail.

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 persistante. Cette fonctionnalité active un modèle de programmation pour les unités de travail de longue durée nécessitant du temps de réflexion de l'utilisateur. Nous les appelons transactions d’application, c’est-à-dire une unité de travail du point de vue de l’utilisateur.

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012

7
Sk Sharma

Permettez-moi d'expliquer dans le point de vue Garbage Collector également.

Il y a 3 états d'objet d'hibernation (ou) Objet Portée d'hibernation-

  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 un objet étudiant->

Student student = new Student(); 

Maintenant, cet objet étudiant est à état transitoire .


Quand on attache cet objet POJO pour hiberner la session-> 

session.save(student);

Maintenant cet objet POJO est à état persistant .

(Le point de vue du ramasse-miettes - le CP ne peut pas effacer n'importe quel objet qui est dans l'état persistant . On peut dire que cet état persistant est comme stockage temporaire pour les objets POJO)


Si nous effectuons->

session.beginTransaction.commit();

alors l'objet POJO est à l'état de stockage permanent ou de base de données 

(Le point de vue de Garbage Collector - le GC ne peut pas effacer cet objet, car cet objet POJO se trouve maintenant en dehors du champ d'application de la machine virtuelle Java et est stocké dans la table.stockage permanent pour les objets POJO)


Si nous effectuons->

session.evict(student); 

alors l'objet POJO est expulsé ou retiré de l'état persistant en état détaché. De plus, cet état d'objet POJO est état détaché .

(Point de vue du récupérateur de mémoire: le CPG peut facilement effacer l'objet POJO de l'état détaché de la machine virtuelle Java)

A côté de la réponse correcte déjà identifiée, persistante, transitoire, détachée ne sont que l'état de l'objet en veille prolongée.

Pour être plus précis, ces trois états indiquent les modifications d’objet en veille prolongée et l’état du cycle de vie de la session.

0
Amol Dixit

Étant donné l'entité suivante:

@Entity
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private long id;

    // other fields and methods.
}

De Documentation Hibernate 5.2 (J'ai également inclus l'état removed):

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 le fichier base de données et en général, aucune valeur d’identificateur n’a été attribuée (sauf si le générateur attribué 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 ou ne pas exister physiquement dans le base de données pour le moment.

// 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é avec 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)

supprimé

l'entité a un identifiant associé et est associée à un contexte de persistance, mais il est prévu qu'il soit supprimé du fichier base de données.

session.remove(city);


Remarque: L’API Hibernate propose plusieurs méthodes pour passer d’un état à l’autre, et je pense qu’il est intéressant d’explorer une classe Hibernate Session .

0
O.Badr