125 votes

Quelle est la différence entre persist() et de fusion() en mode veille prolongée?

Quelle est la différence entre persist() et de fusion() en mode veille prolongée?

persist() pouvez créer une mise à JOUR & de la requête d'INSERTION, par exemple:

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();

dans ce cas, la requête sera généré comme ceci:

Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?

donc, persist() méthode peut générer une Insertion et une mise à Jour.

Maintenant, avec merge():

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();

C'est ce que je vois dans la base de données:

SINGER_ID   SINGER_NAME
1           Ricky Martin
2           Madonna
3           Elvis Presley
4           Luciano Pavarotti

Maintenant mettre à jour un enregistrement à l'aide d' merge()

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setId(2);
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();

C'est ce que je vois dans la base de données:

SINGER_ID   SINGER_NAME
1           Ricky Martin
2           Luciano Pavarotti
3           Elvis Presley

148voto

axtavt Points 126632

Spécification JPA contient une description très précise de la sémantique de ces opérations, mieux que dans la javadoc:

La sémantique de l' persistent l'opération, appliqué à une entité X sont comme suit:

  • Si X est une nouvelle entité, il devient géré. L'entité X sera entré dans la base de données avant ou validation de transaction ou comme un résultat de l'opération de vidage.

  • Si X est un préexistante entité gérée, il est ignoré par la poursuite de l'opération. Toutefois, la poursuite de l'opération est en cascade à des entités référencées par X, si les relations de X à ces d'autres entités sont annotés avec les cascade=PERSIST ou cascade=ALL annotation de la valeur de l'élément ou spécifié avec l'équivalent XML descripteur de de l'élément.

  • Si X est retiré de l'entité, il devient géré.

  • Si X est un détaché de l'objet, de la EntityExistsException peuvent être jetés lors de la poursuite de l'opération est invoquée, ou l' EntityExistsExceptionou un autre PersistenceException peut être jeté à la chasse ou au moment de la validation.

  • Pour toutes les entités, Y référencé par un relation de X, si l' relation à Y a été annoté avec la cascade de la valeur de l'élément cascade=PERSIST ou cascade=ALL, le persistent opération est appliquée à Y.


La sémantique de la fusionde l'opération appliqué à une entité X sont comme suit:

  • Si X est indépendante de l'entité, l'état de X est copié sur un pré-existants géré instance d'entité X' de la même d'identité ou une nouvelle géré copie X' de X est créé.

  • Si X est une nouvelle entité exemple, une nouvelle entité gérée exemple X " est créé et l'état de X est copié dans le nouveau réussi l'instance d'entité X'.

  • Si X est un retiré de l'instance d'entité, un IllegalArgumentException sera lancée par l'opération de fusion (ou de la validation de transaction échouera).

  • Si X est une entité gérée, elle est ignorée par l'opération de fusion, cependant, l' opération de fusion est en cascade à les entités référencées par les relations de X si ces relations ont été annotés avec la cascade la valeur de l'élément cascade=MERGEou cascade=ALL d'annotation.

  • Pour tous les entités Y référencé par les relations de X ayant la cascade élément valeur en cascade=MERGE ou cascade=ALL, Y est fusionné de manière récursive comme Y'. Pour tous tel Y référencé par X, X' est mis à référence de Y'. (Notez que si X est géré alors X est le même objet que X'.)

  • Si X est une entité fusionnée à X', avec une référence à une autre entité Y, où cascade=MERGE ou cascade=ALLest n'est pas spécifié, alors la navigation de la même l'association de X' donne une référence à un objet managé Y " avec la même identité persistante comme Y.

21voto

Vladimir Ivanov Points 23731

La différence est dans ce que vous faites avec l'objet après l'enregistrement dans la base de données.

Persistent prend une instance d'entité, ajoute le contexte et le fait que l'instance géré (c'est à dire les futures mises à jour de l'entité sera suivie)

Fusion crée une nouvelle instance de votre entité, des copies de l'état de la fourniture de l'entité, et rend la nouvelle copie de gestion. L'exemple que vous transmettez ne seront pas gérés (les modifications que vous apportez ne fera pas partie de la transaction, à moins que vous appelez fusion à nouveau).

Voir la discussion ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X