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 :

identifier of an instance of Region was altered


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
    Juillet 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 65
    Par défaut identifier of an instance of Region was altered
    Bonjour,
    j'ai un layout datagrid dans mon Action

    lorsque je clique dans ma jsp, la methode validateSelected() traite l'ajout dans mon datagrid, puis fait un forward vers la méthode display()

    org.hibernate.HibernateException: identifier of an instance of Region was altered from 11 to 28
    dans mn Action methode display() :
    org.hibernate.Session hbsession = HibernateUtil.getSessionFactory().getCurrentSession();

    Criteria cl = hbsession.createCriteria(Region.class);
    //requete
    cl.add(Restrictions.ilike("code", regionsform.getTmpcode()+"%"));
    cl.setFirstResult(firstRecordIndex);

    //datagrid
    Datagrid dg = Datagrid.getInstance();
    dg.setDataClass(Region.class);

    dg.setData(cl.list());
    regionsform.setDatagrid(dg);
    dans mon Action methode validateSelected()
    RegionsForm regionsform = (RegionsForm) in_form;
    org.hibernate.Session hbsession = HibernateUtil.getSessionFactory()

    Region regiono = null;

    // Get the datagrid object.
    Datagrid lc_datagrid = regionsform.getDatagrid();

    // Get the added objects.
    Collection lc_addedObjects = lc_datagrid.getAddedData();

    // dgf.setDatagrid(lc_datagrid.getInstance());
    log.debug("getCode : " + regionsform.getCode());
    log.debug("getLibelle : " + regionsform.getLibelle());

    log.debug("lc_addedObjects :" + lc_addedObjects.size());
    if (lc_addedObjects.size() > 0) {
    // System.out.println("Hello");
    Iterator lc_it = lc_addedObjects.iterator();
    while (lc_it.hasNext()) {
    regiono = (Region) lc_it.next();
    log.debug(regiono.getCode());
    log.debug(regiono.getLibelle());
    log.debug("------------------------------");
    // hbsession.save(regiono);
    // hbsession.flush();
    }

    }

  2. #2
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Le message que tu indique survient lorsque dans une même session Hibernate, tu modifie la clé primaire d'une instance d'objet déjà attachée à la session.
    C'est à dire avec un petit bout de code d'exemple :

    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
    // On cree un objet métier avec un id
    Session s = sf.openSession();
    Transaction tx = s.beginTransaction();
    Event e = new Event();
    e.setTitle("...");
    e.setId(new Long(100));
    s.save(e1);
    tx.commit();
     
    // On change son Id
    Transaction tx2 = s.beginTransaction();
    e.setId(new Long(400));
    s.update(e);
    tx2.commit();
    s.close();
    Changer une clé primaire n'est pas un impact anodin, il s'agit en fait de la suppression d'une entité et de la création d'une nouvelle, même si ses attributs sont identiques.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 65
    Par défaut
    j'ai donc modifié sans faire expres l'id de la session et non l'id de ma list utilisé dans le datagrid. Mais comment réparer ça ?

  4. #4
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Ce n'est pas l'id de la session Hibernate, ni celui d'une liste (notions qui n'existent pas), mais d'objets persistants. Il ne faut donc pas permettre à un utilisateur de modifier une clé primaire sur un écran, en rajoutant une clé primaire générée par exemple. Si ce n'est pas possible, il faut alors supprimer l'ancienne entité et en créer une nouvelle (donc un nouvel objet java)

Discussions similaires

  1. identifier of an instance of was altered from 48 to 127
    Par higher83 dans le forum Hibernate
    Réponses: 5
    Dernier message: 01/07/2010, 12h25
  2. Identifier les differentes instances d'une vue
    Par Nachim dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 20/03/2008, 10h39
  3. Réponses: 2
    Dernier message: 27/07/2007, 09h21
  4. Réponses: 1
    Dernier message: 02/05/2007, 22h41
  5. Réponses: 2
    Dernier message: 19/10/2006, 15h29

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