# Java > Gnral Java > Persistance des donnes >  Mise  jour cl primaire merge()?

## Razielback

Bonjour j'ai une petite question  poser, j'ai un peu de mal  comprendre la mthode merge().
Dans mon cas je souhaite modifier des lment d'une table:
- quand je modifie autre chose que la cl primaire en utilisant la mthode merge, pas de soucis.
- quand je modifie la cl primaire pour une nouvelle cl, si celle-ci n'existe pas il me cre un objet avec les nouvelles informations et je suis obliger de supprimer l'ancien objet avec remove.
-enfin quand je modifie la cl primaire par une cl existante il m'crase les informations de la donn existante.

Les deux derniers cas me semblent assez bizarre, j'ai l'impression de mal avoir compris le principe du merge et la diffrence entre merge et flush j'aurais mme penser que l'entitymanager aurait lev une exception pour le 3eme cas comme il le fait quand il persist (constraintsqlexception).

Merci de m'clairer, bonne journe.

----------


## fr1man

Flush envoie les instructions SQL  la base.

Merge permet la mise  jour d'un objet en session mais le changement en base n'intervient qu'aprs le flush.

On ne modifie pas une cl primaire en base.
Donc il est logique qu'un nouvel objet soi cr s'il n'existe pas.
Si l'objet existe, ses valeurs seront modifies.

----------


## DevServlet

Bonjour,
Ton post n'est pas sur le bon forum, tu devrai le mettre dans le forum de persistence, mais je rponds nanmoins avant que les admins ne le dplacent:


```
- quand je modifie autre chose que la clé primaire en utilisant la méthode merge, pas de soucis.
```

Normal, c'est le fonctionnement prvu de merge, il met  jour les donnes prsentes en mmoire, avec celles prsentes en bd, ce rien que pour l'objet prsent en base.c'est un "update" en d'autres termes.


```
- quand je modifie la clé primaire pour une nouvelle clé, si celle-ci n'existe pas il me crée un objet avec les nouvelles informations et je suis obliger de supprimer l'ancien objet avec remove.
```

Par principe on ne modifie pas la cl primaire d'un enregistrement,c'est un principe fondamental  la notion de base de donne, c'est normal que merge se positionne sur l'enregistrement dont la cl primaire est dfinie dans l'objet que tu veux mettre  jour.


```
j'ai l'impression de mal avoir compris le principe du merge et la différence entre merge et flush
```

Flush quant  lui ne prend pas de paramtres, mais son role est plus gnral, il synchronise toutes les entits attachs avec la base de donne, il faut gnralement l'utiliser si tu es en politique auto_commit=false et que tu veux dconnecter un user, moi perso je ne le fais pas souvent car c'est couteux, donc mon auto commit est en gnral  true.
Voila voila

----------


## Razielback

Et pour un remove c'est pareil, il supprime en base aprs le flush?
Merci pour les infos.

----------


## fr1man

Le mode auto-commit est dconseill dans la documentation.
En effet, on perd tout l'intrt d'une transaction.

Le flush sert notamment lorsque l'on doit insrer beaucoup de donnes en base, pour ne pas faire exploser le cache de premier niveau.

----------


## DevServlet

```
Le mode auto-commit est déconseillé dans la documentation.
```

En effet, j'ai vrifi, je ne modifie jamais ce paramtre, par dfaut il doit tre  false je suppose, toutes mes transactions sont gres par injection Spring, je ne fais donc jamais de flush, merge et persist me suffisent.

----------


## Razielback

Merci pour les informations, j'ai refais un peu ma base pour qu'elle soit plus "propre" (cls primaires = id) par contre j'ai un petit problme toujours avec mon merge(), je  n'arrive pas  capturer l'exception lorsqu'il viole une contrainte unique avec un try catch pourtant je suis aller franchement avec un catch (exception e) mais cela ne capture pas mon exception.(Caused by: org.hibernate.exception.ConstraintViolationException,Caused by: java.sql.BatchUpdateException)

----------

