IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Hibernate Java Discussion :

Double association avec Hibernate


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Par défaut Double association avec Hibernate
    Bonjour ,

    J'ai un petit problème avec un mapping Hibernate. J'ai un objet de type User qui contient 2 List d'objets type B. Une pour les objet B que le User crée, une autre, pour des objets de type B pouvant être assigné au User.

    Ce qui donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <list name="addBList" lazy="false"  cascade="save-update" >
    		<key column="userId" />
    		<list-index column="IDX" />
    		<many-to-many class="B" />
    	</list>
     
    	<list name="assignBlist" lazy="false"   cascade="save-update">
    		<key column="userId" />
    		<list-index column="IDX2"  />
    		<many-to-many class="B" />
    </list>
    Le problème que je rencontre :

    Si je crée un utilisateur, 2 objets de type B, que je lui ajoute (list addBList) ces 2 objets B. Puis que je lui assign ces 2 même objets B (list assignBlist), puis que je sauve l'objet User -> ça marche : Mes 2 objets de type B sont créés, le User aussi, et mes tables de jointures correctement remplies.

    Par contre, si je crée un utilisateur, 2 objets de type B , que je lui ajoute ces 2 objets B. Ensuite je sauve le user -> User crée, les 2 objets B aussi , la table de jointure addBList correctement remplie. Ensuite je recharge mon User, je recharge mes 2 objets B , je lui assign ces 2 objets B, je resave mon User -> ma table assignBList n'est pas remplie.

    Autre cas, si je fait le 2eme exemple mais cet fois en assignant les objets B à un autre User créé, il me save bien mon user, et rempli correctement la table assignBList.

    J'espere avoir été clair ne pouvant pas trop divulguer mon code. Pour tout ce qui est save, recuperation d'objets, je passe par un HibernateTemplate

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    vu qu'apparement tu as des règles métiers qui rendent tes deux listes interdépendantes, as-tu vérifié que ce ne sont pas ces règle qui "éjectent" des données avant le save?

    sinon, faudrait voir le code du sauve - recherche - assigne - sauve - vérifie la db.

    Aucune exception visible? Utiliser show_sql avec hibernate pourrait aussi donner une idée de ce qui se passe en arrère plan.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Par défaut
    Concernant les règles métiers, actuellement ce ne sont que des add dans les list associés.

    Pour le code du sauve, c'est un simple

    public void saveObject(final Object object) {

    getHibernateTemplate().saveOrUpdate(object);
    }

    Pour la recherche :

    public Object getObjectById(final Class arg0, final Serializable arg1) {
    return getHibernateTemplate().get(arg0, arg1);
    }


    Pas d'exception visible, et j'ai toujours mon show_sql à true. Lors du 2eme save, il me fait juste un Select from where. Mais aucun update. C'est comme ci il ne détectait pas de changements.


    EDIT : il y avait bien une exception lancée !!

    org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    bon ben voilà, t'as trouvé Soit tu mélange des objets entre deux sessions, ce qui peut finir avec deux "mêmes objets mais différents dans la même session", soit tu crée de nouveaux objet en leur définissant un id qui est déjà attribué.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Par défaut
    J'ai enlever le rechargement du user dans mon test JUnit, et ça marche.

    Donc j'ajoute un user , je save, puis j'assign je save, ça c'est bon.

    Y'a juste encore un soucis au niveau frontend où là ça bug encore. Je mettrai en résolu quand tout marchera

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Par défaut
    Hop, me revoilà


    Le problème n'est pas partit. Le fait d'enlever le 2eme chargement du user dans mon test unitaire règle le problème, mais ne correspond pas à la réalité de mon application !

    En effet, dans mon application, un utilisateur peut ajouter des objets de type B. Ensuite, un admin, peut assigner cette liste d'objets B a des User. Il peut donc assigner un objet de type B a celui qui l'a créé! C'est ce cas ci qui plante.

    Après quelques tests, la seule solution qui fonctionne c'est le merge. En effet, merge() ne se préoccupe pas des sessions. Seul problème : la génération d'id ! Si je sauve un objet type B grâce à merge -> il n'a pas d'id, hibernate en génére un, le sauve. Si je veux le resave il n'a toujours pas d'id, donc pas d'update mais creation d'un nouvel objets type B dans ma BD ! En fait tout marche parfaitement avec merge si je gère moi même les id des complaints, mais ça j'ai pas envie.

    Voici le test que j'effectue qui me permet de mettre en evidence le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    user1 = userDAO.getUserById(Long.valueOf(1));
    		user1.addB(B1);
    		user1.addB(B2);
     
    		userDAO.saveUser(user1);
     
    		user1 = userDAO.getUserById(Long.valueOf(1));
     
    		user1.addAssignedB(B1);
    		user1.addAssignedB(B2);
     
    		userDAO.saveUser(user1);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/12/2010, 16h39
  2. probleme avec le mapping d'association avec hibernate
    Par senediene dans le forum Hibernate
    Réponses: 2
    Dernier message: 10/08/2006, 13h59
  3. [Plugin][Hibernate]Eclipse avec hibernate(synchronizer)
    Par mg67 dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 23/06/2005, 17h19
  4. [XSLT]tableau double entrée avec cellule manquante
    Par nferay dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 08/03/2005, 15h07
  5. Restaurer un double-boot avec Lilo
    Par Laurent Gomila dans le forum Administration système
    Réponses: 7
    Dernier message: 28/11/2004, 18h14

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