(update() met à jour, s'il n'y a pas de clé primaire, une erreur sera signalée.
saveOrUpdate() enregistre ou met à jour, effectue une insertion sans clé primaire.
Mise à jour : il s'agit d'une opération de mise à jour pour les objets transitoires (transitoires) ou simplement détachés (détachés). L'opération de mise à jour pour les objets transitoires n'a généralement aucun effet. Pour les objets détachés, une opération de synchronisation est effectuée, c'est-à-dire que les données de la base de données changent. Et l'état de l'objet devient également un objet géré
SaveOrUpdate : Il fonctionne également sur les opérations transitoires ou détachées Quant à savoir s'il faut insérer ou mettre à jour, il doit être analysé selon certaines conditions spécifiques spécifiées dans l'identifiant. Cependant, je pense personnellement que lorsqu'il est évident que seule l'opération d'insertion aura lieu, il vaut mieux éviter d'utiliser saveOrUpdate et simplement utiliser save directement)
Commençons par quelques notions :
Dans Hibernate, le concept de base est la gestion de l'état du PO. Un PO a trois états :
1. VO qui n'est pas conservé
A ce moment, il s'agit d'un objet mémoire VO, et le cycle de vie est géré par la JVM.
2. Le PO a été conservé et les données de la base de données sont mappées à ce moment-là pendant le cycle de vie de la session, et la base de données gère le cycle de vie.
3. Il a été conservé, mais il a maintenant été détaché de la session. Si vous exécutez ce PO qui a été détaché de la session en tant que VO, vous pouvez également entrer dans une autre session et continuer à gérer l'état du PO à ce moment. , cela devient un PO Le deuxième état. Ce type de PO traverse en fait
La session effectue la maintenance de l'état.
Dans JDO1.x traditionnel, PO n'a que les deux premiers états. Une fois qu'un PO est séparé du PM, il perd son état et n'est plus associé aux données de la base de données. Il devient un pur VO mémoire.
Même si vous ajoutez un nouveau MP, son statut ne peut pas être restauré.
La force d'Hibernate est qu'après qu'un PO quitte la session, il peut toujours maintenir l'état. Après être entré dans une nouvelle session, la capacité de gestion de l'état est restaurée.
Vous devez utiliser session.update ou session.saveOrUpdate, ce que la référence Hibernate mentionnée dans "nécessite une programmation légèrement différente
modèle"
Entrez maintenant officiellement dans ce sujet :
En termes simples, update et saveOrUpdate sont utilisés pour gérer le statut des bons de commande intersessions.
En supposant que votre bon de commande n'a pas besoin de traverser des sessions, il n'est pas nécessaire de l'utiliser. Par exemple, si vous ouvrez une session, exploitez le bon de commande, puis le fermez, vous n'utiliserez plus ce bon de commande.
Il n’est alors pas nécessaire d’utiliser la mise à jour.
Regardons donc l'exemple ci-dessus :
Code Java
Foo foo=sess.load(Foo.class,id);;
foo.setXXX(xxx);;
sess.flush();;
sess.commit();;
Foo foo=sess.load(Foo.class,id);; foo.setXXX(xxx);; sess.flush();;
Les opérations de l'objet PO foo sont toutes terminées dans le cycle de vie d'une session, il n'est donc pas nécessaire d'effectuer explicitement des opérations telles que sess.update(foo). Hibernate détectera automatiquement que l'objet foo a
a été modifié, donc une mise à jour SQL est envoyée à la base de données. Bien sûr, ce n'est pas mal si vous insistez pour ajouter sess.update(foo), mais ce n'est pas nécessaire.
Cross-Session signifie qu'après la fermeture de la session, vous utilisez toujours cet objet PO comme VO. Plus tard, vous modifiez ses propriétés en dehors de la session, puis vous souhaitez l'ouvrir à nouveau.
Ouvrez une session et enregistrez les modifications de l'attribut VO dans la base de données, vous devez ensuite utiliser la mise à jour.
Code Java
// lors de la première séance
Chat chat = (Cat); firstSession.load(Cat.class, catId);;
Potentiel de chatMate = new Cat();;
firstSession.save(potentialMate);;
// dans un niveau supérieur de l'application
cat.setMate(potentialMate);;
// plus tard, dans une nouvelle session
secondeSession.update(cat);; // mettre à jour le chat
secondSession.update(mate);; // mettre à jour le compagnon
// lors de la première session Cat cat = (Cat); firstSession.load(Cat.class, catId);; Cat potentialMate = new Cat();;
firstSession.save(potentialMate);; // dans un niveau supérieur de l'application cat.setMate(potentialMate);; // plus tard, dans un
nouvelle session secondeSession.update(cat);; // mise à jour cat secondeSession.update(mate);;
Les objets cat et mate sont obtenus lors de la première session. Une fois la première session fermée, ils deviennent le troisième état du PO, et le PO que la session a détaché à ce moment-là.
Leurs informations de statut sont toujours conservées. Lorsqu'ils entrent dans la deuxième session, ils peuvent immédiatement mettre à jour leur statut. Mais à cause de l'opération de modification sur cat : cat.setMate
(potentialMate); est effectué en dehors de la session. Hibernate ne peut pas savoir que l'objet cat a été modifié. La deuxième session ne connaît pas cette modification, elle doit donc être explicite.
Appelez secondSession.update(cat); pour informer Hibernate que l'objet cat a été modifié et que vous devez envoyer la mise à jour SQL.
C'est donc le rôle de la mise à jour. Elle ne sera écrite que lorsqu'un objet PO synchronise son statut entre les sessions. Lorsqu'un objet PO n'a pas besoin d'être traité à travers les sessions,
Lors de la gestion de l'état, il n'est pas nécessaire d'écrire des mises à jour.
Parlons de l'utilisation de saveOrUpdate :
La différence entre saveOrUpdate et update réside dans la stratégie qu'Hibernate adopte pour le PO dans la gestion de l'état du PO entre sessions.
Par exemple, lorsque vous écrivez un DAOImpl, ajoutez une contrainte à l'objet cat, comme défini ci-dessous :
Code Java
public void addMate (Chat chat, Mate compagnon); {
Session session = ... ;
Transaction tx = ... ;
session.update(cat);;
cat.addMate(mate);;
tx.commit();;
session.close();;
} ;
public void addMate(Cat cat, Mate mate); { Session session = ...; Transacton tx = ...;
cat.addMate(mate);; tx.commit();; session.close();;
Évidemment, vous devez encapsuler les opérations Hibernate dans DAO, afin que les programmeurs de couche métier et les programmeurs de couche Web n'aient pas besoin de connaître Hibernate et d'appeler directement DAO.
À ce stade, le problème se pose : il existe une condition préalable nécessaire pour que le code ci-dessus s'exécute correctement, c'est-à-dire que l'objet cat du paramètre d'appel de méthode doit être un PO qui a été conservé, c'est-à-dire qu'il doit
Interrogez-le d’abord à partir de la base de données, puis utilisez-le comme ceci. Mais les programmeurs de la couche métier ne connaissent évidemment pas ce mystère interne, si leur tâche consiste à ajouter un chat de temps en temps.
Son compagnon, il l'appellera évidemment ainsi, un nouvel objet chat sort, et puis addMate :
Code Java
Chat chat = nouveau Chat();;
cat.setXXX();;
daoimpl.addMate(cat,mate);;
Chat chat = nouveau Chat();; cat.setXXX();; daoimpl.addMate(cat,mate);;
Mais veuillez noter que cet objet cat n'est qu'un VO, il n'a pas été conservé, ce n'est pas un PO et il n'est pas qualifié pour appeler la méthode addMate, donc l'appel de la méthode addMate n'ira pas réellement à
Pour envoyer une mise à jour SQL dans la base de données, l'objet cat doit d'abord être enregistré dans la base de données. Ce n'est qu'après qu'il est véritablement devenu un PO qu'il peut être qualifié pour addMate.
Il faut procéder ainsi :
Code Java
Chat chat = nouveau Chat();;
cat.setXXX();;
daoimpl.addCat(cat);;
daoimpl.addMate(chat, compagnon);;
Chat chat = nouveau Chat();; cat.setXXX();; daoimpl.addCat(cat);;
Persistez d'abord sur cat, puis effectuez d'autres opérations de persistance sur cat. Par conséquent, les programmeurs de la couche métier doivent savoir dans quel état se trouve l'objet cat, qu'il s'agisse du premier ou du troisième.
S'il s'agit du premier type, vous devez d'abord enregistrer, puis addMate ; s'il s'agit du troisième type, ajoutez simplement directement AddMate.
Mais le plus fatal est que si l'ensemble du logiciel comporte plusieurs couches, l'objet chat que le programmeur de la couche métier obtient peut être le chat transmis par la couche supérieure de l'application Web, et lui-même ne le sait pas.
Que cat soit VO, n'a pas été persistant ou a été persistant, alors il n'a aucun moyen d'écrire un programme.
Un tel DAOImpl est donc évidemment problématique.Il entraînera de nombreux pièges de programmation pour les programmeurs de la couche métier qui doivent avoir une compréhension approfondie de chaque paire de PO de paire DAO qu'ils appellent.
Quel que soit le type de gestion de l'état effectué, vous devez avoir une compréhension approfondie de l'état exact de son objet PO à tout moment pour garantir l'exactitude de la programmation. Évidemment, cela est impossible, mais avec.
saveOrUpdate, ces problèmes sont facilement résolus.
Vous devez maintenant modifier la méthode addMate :
Code Java
public void addMate (Chat chat, Mate compagnon); {
Session session = ... ;
Transaction tx = ... ;
session.saveOrUpdate(cat);;
cat.addMate(mate);;
tx.commit();;
session.close();;
} ;
public void addMate (Cat cat, Mate mate); { Session session = ...; Transacton tx = ...;
(cat);; cat.addMate(mate);; tx.commit();; session.close();;
Comme ci-dessus, si le programmeur de la couche métier transmet un objet PO qui a été conservé, alors Hibernate mettra à jour l'objet cat (en supposant que le programmeur de la couche métier l'a modifié en dehors de la session).
cat), si ce qui est transmis est un nouvel objet, enregistrez l'objet PO dans la base de données.
BTW : Le fait qu'Hibernate mette à jour l'objet cat ou enregistre l'objet cat à ce moment dépend du paramètre de valeur de non-sauvegarde.
De cette façon, les programmeurs de la couche métier n'ont plus à se soucier du statut du PO. Pour eux, peu importe que cat soit un nouvel objet, juste un VO, ou qu'il soit interrogé dans la base de données.
Quels que soient les objets PO, ils peuvent tous être ajoutés directement à addMate :
Code Java
daoimple.addMate(chat, compagnon);;
daoimple.addMate(chat, compagnon);;
C'est ce que fait saveOrUpdate.
Cet article provient du blog CSDN Veuillez indiquer la source lors de la réimpression : http://blog.csdn.net/zhrl0000/archive/2009/12/17/5027965.aspx.
-