-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: Suppression/Création dans une même transaction
PostPosted: Fri May 06, 2005 3:16 am 
Newbie

Joined: Fri May 06, 2005 2:51 am
Posts: 2
Location: Tours
Bonjour,

Avec Hibernate 3, je ne parviens pas, dans une même transaction, à supprimer une donnée et à en recréer une, dès lors que je réutilise un champ "unique" de la donnée supprimée.

Par exemple si je définis une classe DCategory ayant un identifiant technique Id et un champ "unique" Name.
Il n'est pas possible d'enchainer les étapes ci-dessous dans une seule transaction :
1. sélectionner une catégorie existante
2. supprimer la catégorie
3. en créer une autre ayant le même champ Name (mais bien sûr un autre Id).

Si je tente l'opération je provoque:
org.hibernate.util.JDBCExceptionReporter - ERROR: duplicate key violates unique constraint "category_name_key"

Pour m'en sortir, j'exécute session.flush() après la suppression.
Mais cette solution n'est pas très "propre".

Pourquoi l'opération de suppression n'est elle pas exécutée tout de suite ?

J'ai pris un exemple simpliste, mais dans la réalité j'ai besoin de pouvoir mettre complètement à jour un graphe d'objets dans lequel certains objets conserveront leur champ"unique" et d'autres pas.
Dans une telle situation, je suis bien obligé de tout détruire pour tout recréer ensuite.

PS:
Le mapping qui illustre mon exemple simpliste:
<hibernate-mapping>
<class
name="bean.DCategory"
table="Category"
dynamic-update="false"
dynamic-insert="false"
>
<id name="id" column="id" type="long">
<generator class="native"/>
</id>
<property
name="name"
type="string"
unique="true"
column="name"
/>
<property
name="comment"
type="string"
unique="false"
column="comment"
/>
</class>


Top
 Profile  
 
 Post subject:
PostPosted: Fri May 06, 2005 10:38 am 
Senior
Senior

Joined: Tue Feb 08, 2005 5:26 pm
Posts: 157
Location: Montréal, Québec - Canada
Bonjour,

Pour des raisons d'optimisation, la session enregistre les opérations à exécuter et ne le fait que lorsque la méthode session.flush() est appelée.

Cette méthode peut être appelée directement par vous, ou le sera lorsque vous faites un transaction.commit().

Vous pouvez essayer d'appeler session.flush() au milieu de votre transaction, juste après avoir détruit votre object. Je crois que vous pourrez ensuite persister le nouvel objet qui vous causait des problèmes.

De plus, je crois que session.flush() est réversible: c'est à dire que si ceci est fait dans le cadre d'une transaction qui échoue, l'écriture en base de données n'aura pas lieu (Il n'y aura pas de commit de fait sur la transaction JDBC).

Bonne journée,

Vincent Giguère
J2EE Developer
Montréal


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.