-->
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.  [ 9 posts ] 
Author Message
 Post subject: More than one row ...
PostPosted: Thu Sep 08, 2005 5:34 am 
Newbie

Joined: Thu Sep 08, 2005 5:29 am
Posts: 10
J'utilise Hibernate 2.1
J'ai une HibernateException qui me dit que j'ai deux entités qui ont la meme PK, et pourtant dans la BD, rien à signaler, quand il lance cette exception, j'ai aussi une histoire de failed to lazy-initialise a collection, ça doit venir de ça.
Alors, si ça dit quelque chose à qqun, merci d'avance.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 5:49 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Salut,

C'est un "problème" connu - il serait aussi possible de t'aider si tu fournissais plus d'information.

Sinon le mieux est de chercher sur Google avec le nom de la classe de ton exception :-).

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 6:21 am 
Newbie

Joined: Thu Sep 08, 2005 5:29 am
Posts: 10
ok, merci, je teste sur google et si je lutte trop, je reviens par ici ;-)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 6:36 am 
Newbie

Joined: Thu Sep 08, 2005 5:29 am
Posts: 10
toujours la misere, j'ai du reinitialiser la BD pour que les autres puissent travailler ... voici la trace de l'execution :
Code:
09:13:21,625 ERROR PersistentCollection:198 - Failed to lazily initialize a collection
net.sf.hibernate.HibernateException: More than one row with the given identifier was found: 1, for class: com.centiris.elise.bd.project.BDAction
   at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:71)
   at net.sf.hibernate.loader.EntityLoader.loadByUniqueKey(EntityLoader.java:55)
   at net.sf.hibernate.persister.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:1116)
   at net.sf.hibernate.impl.SessionImpl.loadByUniqueKey(SessionImpl.java:3909)
   at net.sf.hibernate.type.EntityType.resolveIdentifier(EntityType.java:211)
   at net.sf.hibernate.impl.SessionImpl.initializeEntity(SessionImpl.java:2219)
   at net.sf.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:319)
   at net.sf.hibernate.loader.Loader.doQuery(Loader.java:309)
   at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:138)
   at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:941)
   at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:961)
   at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:59)
   at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:51)
   at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:413)
   at net.sf.hibernate.impl.SessionImpl.doLoad(SessionImpl.java:2131)
   at net.sf.hibernate.impl.SessionImpl.doLoadByClass(SessionImpl.java:2001)
   at net.sf.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:1963)
   at net.sf.hibernate.type.ManyToOneType.resolveIdentifier(ManyToOneType.java:69)
   at net.sf.hibernate.type.EntityType.resolveIdentifier(EntityType.java:208)
   at net.sf.hibernate.type.ComponentType.resolveIdentifier(ComponentType.java:405)
   at net.sf.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:145)
   at net.sf.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:431)
   at net.sf.hibernate.loader.Loader.getRowFromResultSet(Loader.java:205)
   at net.sf.hibernate.loader.Loader.doQuery(Loader.java:285)
   at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:138)
   at net.sf.hibernate.loader.Loader.loadCollection(Loader.java:1020)
   at net.sf.hibernate.loader.Loader.loadCollection(Loader.java:995)
   at net.sf.hibernate.loader.OneToManyLoader.initialize(OneToManyLoader.java:93)
   at net.sf.hibernate.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:288)
   at net.sf.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:3315)
   at net.sf.hibernate.collection.PersistentCollection.initialize(PersistentCollection.java:195)
   at net.sf.hibernate.collection.PersistentCollection.read(PersistentCollection.java:71)
   at net.sf.hibernate.collection.Set.iterator(Set.java:130)
   at com.centiris.elise.recherche.Recherche2.rechercheCRRNorm(Recherche2.java:1523)
   at com.centiris.elise.recherche.Recherche2.rechercheProjetNorm(Recherche2.java:2507)
   at com.centiris.elise.recherche.Recherche.rechercheNormaleProjet(Recherche.java:801)
   at nico.TestNico.main(TestNico.java:1437)



La classe BDAction est une entité reliée à pleins d'autres entités, de quelle genre d'association peut-venir le problème ?

Aussi, je met dans la même transaction des suppressions, des ajouts et encore des suppressions, ça marchait pas trop, alors j'ai mis des flush() par acquis de conscience, et ça passe, j'ai pas trop cherché à comprendre, mais on m'a dit que c'était pas trop la grande classe, est-ce que je dois utiliser une transaction par opération ?

Pour finir, j'ai regardé sur internet, et c'est pas le déluge de réponse sur ce problème, si vous avez des liens, pensez à moi, merci d'avance.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 6:48 am 
Newbie

Joined: Thu Sep 08, 2005 5:29 am
Posts: 10
voici le fichier de mapping de BDAction :

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
   PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
   <class name="com.centiris.elise.bd.project.BDAction"
      table="tbl_Acti">

      <meta attribute="class-description">La classe action</meta>

      <id name="id" unsaved-value="-1" type="long" column="idAction">
         <meta attribute="scope-set">protected</meta>
         <generator class="native" />
      </id>

      <property name="nom" type="string" length="50" not-null="true" />

      <property name="description" length="10000" type="string" />

      <property name="difficulte" length="1000" type="string" />

      <property name="delaiEstime" type="integer" />

      <property name="delaiConstate" type="integer" />

      <property name="dateDebut" type="date" />

      <property name="dateFin" type="date" />

      <property name="priorite" type="integer" not-null="true" />

      <property name="commentaires" length="1000" type="string" />

      <property name="nbPersonnesAffectees" type="integer" />

      <property name="etatAction" type="short" not-null="true" />

      <property name="avancement" type="short" />

      <property name="occurence" type="integer" not-null="true" />

      <property name="archiver" type="boolean" not-null="true" />

      <!-- ==============================================
         Périodicité de l'action
         ============================================== -->
      <many-to-one name="quotidien"
         class="com.centiris.elise.bd.project.BDQuotidien"
         column="idQuotidien" not-null="false" cascade="save-update" />

      <many-to-one name="hebdomadaire"
         class="com.centiris.elise.bd.project.BDHebdomadaire"
         column="idHebdomadaire" not-null="false" cascade="save-update" />

      <many-to-one name="mensuel"
         class="com.centiris.elise.bd.project.BDMensuel" column="idMensuel"
         not-null="false" cascade="save-update" />

      <many-to-one name="annuel"
         class="com.centiris.elise.bd.project.BDAnnuel" column="idAnnuel"
         not-null="false" cascade="save-update" />

      <!-- ==============================================
         Relation avec PR via la classe d'association BDActionPR
         ============================================== -->
      <set name="actionsPRs" inverse="true" lazy="true"
         cascade="all-delete-orphan">
         <key column="idAction" />
         <one-to-many
            class="com.centiris.elise.bd.project.BDActionPR" />
      </set>

      <!-- ==============================================
         Relation avec CRR via la classe d'association BDActionCRR
         ============================================== -->
      <set name="actionsCRRs" inverse="true" lazy="true"
         cascade="all-delete-orphan">
         <key column="idAction" />
         <one-to-many
            class="com.centiris.elise.bd.project.BDActionCRR" />
      </set>

      <many-to-one name="confidentialite"
         class="com.centiris.elise.bd.project.BDConfidentialite"
         column="idConfidentialite" not-null="true" cascade="none" />

      <many-to-one name="projet"
         class="com.centiris.elise.bd.project.BDProjet" column="idProjet"
         not-null="true" cascade="none" />

      <many-to-one name="personneAffecte"
         class="com.centiris.elise.bd.team.BDPersonne"
         column="idPersonneAffecte" not-null="true" cascade="none" />

      <many-to-one name="personneRealise"
         class="com.centiris.elise.bd.team.BDPersonne"
         column="idPersonneRealise" not-null="true" cascade="none" />

      <many-to-one name="pieceJointe"
         class="com.centiris.elise.bd.project.BDPieceJointe"
         column="idPieceJointe"  cascade="none" />

   </class>
</hibernate-mapping>


Si vous avez besoin de plus d'éléments, faites moi signe


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 7:05 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
La cause immédiate du problème est Recherche2.rechercheCRRNorm(Recherche2.java:1523) - voir trace de l'exception. Il s'agit apparemment d'une association many-to-one. De plus on voit que l'identificateur qui pose problème est 1
Cela permet-il de cerner le problème?

Quote:
Aussi, je met dans la même transaction des suppressions, des ajouts et encore des suppressions, ça marchait pas trop, alors j'ai mis des flush() par acquis de conscience, et ça passe

Dans de telles conditions il est parfois nécessaires (mon expérience, pas une règle générale) d'utiliser flush (spécialement après les suppressions).

Quote:
est-ce que je dois utiliser une transaction par opération ?

Ce n'est certainement pas la méthode à conseiller - la transaction doit garantir que soit tout se passe bien, soit rien ne se passe. Si tu change cela, tu risques de laisser un désordre innommable dans la BD.

Même si j'ai dit que c'était un problème connu, il n'est pas facile à résoudre concrètement lorsqu'on peu d'info sur le contexte comme c'est mon cas pour l'instant.

Te donner une explication générale ne serait sans doute pas non plus très utile.

Mon conseil pour l'immédiat:
1) essaie de reproduire le problème dans un contexte plus simple
ou
2) Debogue jusqu'au niveau d'Hibernate (sportif, mais je l'ai souvent fait pour comprendre ce qui se passe) - tu verras alors quelle classe pose le problème...
3) envoie + ou - tout ce que tu as...

Je conseillerais 1, mais je ne sais pas si c'est facile...

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 7:11 am 
Newbie

Joined: Thu Sep 08, 2005 5:29 am
Posts: 10
Merci Erik, je vais tester la premiere solution, meme si ça fait pas envie, si je trouve pas avant demain, je laisserai un post, merci pour tes conseils et ta dispo.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 7:17 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
nico2282 wrote:
voici le fichier de mapping de BDAction :

Effectivement, avec ce mapping il est bien difficile de savoir quelle est la cause du problème (l'aiguille dans la meule de foin...).

Ce qui pourrait peut-être (seulement peut-être) aider serait de savoir la séquence exacte des opérations (suppressions, ajouts) que tu fais.

Sinon - autre idée - serait de trouver le ou les flush qui sont nécessaires pour que cela marche. Tu auras alors des suspects précis.

Le plus efficace serait sans doute de déboguer dans Hibernate - si tu l'as déjà fait, sinon je ne le conseille pas.

Si tu es vraiment sous pression, laisse les flush - et reviens sur le problème à un moment plus calme...

Désolé de ne pas pouvoir être plus utile.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 10:29 am 
Newbie

Joined: Thu Sep 08, 2005 5:29 am
Posts: 10
effectivement, c'est un beau chantier, mais je crois que tu as raison, il faut que je me concentre sur les opérations que j'effectue sur les BDActions lorsque je suis à l'intérieur d'une transaction.
Merci encore. ;-)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 9 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.