Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    décembre 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2013
    Messages : 15
    Points : 12
    Points
    12
    Par défaut DuplicateKeyException lors de la sauvegarde d'un nouvel objet dans la base de données
    Bonjour,

    Je j'utilise GORM pour sauvegarder des occurrences dans une base de données à partir d'un fichier Excel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    new ExcelBuilder(excelFile.inputStream).eachLine([labels: true, sheet: 0]) {
    				if (cell(0)) {
    					def nameA = cell(0)
    					def nameB = cell(1)
    					def a = Chapitre.findByNom(nameA)
     
    					def code = cell(2)
    					def designation = cell(3)
     
    					if (code == null || nameA == null || nameB == null) {
    						flash.messages << "error"
    					} else if (!Chapitre.findByNom(nameA)) {
    						flash.messages << "error"
    					} else if ( Rubrique.where{nom == nameB && chapitre == a}.list().size() == 0) {
    						flash.messages << "error"
    					} else if(Object.where{rubrique == Rubrique.findByNom(nameB) && c == code && d == designation}.count() > 0){
    						flash.messages << "error"
    					} else {
     
    							def b = Rubrique.findByNom(nameB)
     
    							//request.getSession().removeAttribute("nuisanceType")
    							def isNew = false;
     
    							Object.withNewSession {session2->
    								def object = Object.findOrCreateByCode(code)
     
    								if(object.designation == null)
    									isNew = true;
     
    								object.rubrique = b
    								object.d= (designation == null)?"":designation
    //								try	{
    									rowCount += object.save()? 1 : 0
    //								} catch(ValidationException) {
    //									  if(isNew)
    //										  rowCount++;
    //									  log.info("ErreuRRRRRRRRrrrRRrrRrRRrrrrRrrrRrrrRrrrr")
    //								}
    							}
    					}
    				}
    				currentLine++
    }
    flash.messages << "${rowCount} ligne create or update"

    Une mise à jour sera effective sans aucun soucis, les lignes du fichier Excel continuent d'être itérées et l'enregistrement en base de données est efficace pour cette occurrence.

    Cependant, quand il vient à l'insertion (save) d'un nouvel objet, je reçois une erreur à la sauvegarde :
    " org.springframework.dao.DuplicateKeyException: a different object with the same identifier value was already associated with the session: [fen.NuisanceType#2202]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session"

    L'enregistrement de l'objet en question est efficace, mais l'erreur soulevée bloque le parcours du fichier.

    Quand je décommente la «try and catch" je contourne l'erreur et ainsi toutes mes nouvelles occurrences du fichier sont créés dans la base de données.

    J'ai donc trouvé un moyen de contourner mon soucis, mais je ne le trouve pas très propre et je viens à vous pour essayer de comprendre mon problème.

    Avez-vous des idees ?

    Je vous remercie par avance

  2. #2
    Membre averti Avatar de Soulama
    Profil pro
    Développeur informatique
    Inscrit en
    mai 2004
    Messages
    616
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2004
    Messages : 616
    Points : 405
    Points
    405
    Par défaut
    Si tu met: findOrCreateByCode faudra mettre un truc du genre saveOrUpdate et pas un simple save()
    Apprends la science de celui qui sait, et enseigne ta science à celui qui ignore, comme ca, tu auras appris ce que tu ignores et utilisé ce que tu sais.

Discussions similaires

  1. [Débutant] La sauvegarde automatique d'un DataSet dans la base de données.
    Par amina-info dans le forum VB.NET
    Réponses: 0
    Dernier message: 25/03/2014, 15h41
  2. Réponses: 4
    Dernier message: 27/11/2013, 13h35
  3. @Id null lors de la création d'un nouvel objet
    Par zuzuu dans le forum Hibernate
    Réponses: 3
    Dernier message: 18/02/2009, 21h15
  4. Insertion de nouvelles collonnes dans ma base de donnée ?
    Par _cece dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 17/11/2008, 10h53
  5. [Conception] Repérer un nouvel enregistrement dans une base de données
    Par MikeV dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 30/08/2007, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo