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 :

[hibernate] "many-to-one"


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
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut [hibernate] "many-to-one"
    j'ai un petit souci avec mon test,

    j'ai deux classes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    classe toto{                   classe titi{
     string  key_toto;             String key_titi;
    }                                   toto TOTO; }
    


    dans la base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    create table toto {           create table titi {
    key_toto varchar(10);       key_titi  varchar(10);
    }                                   key_toto varchar(10);}


    donc voila quand je veux faire une sauvegarde à partir de mes classe il me sort une erreur au niveau du "SAVE" dans le test correspondant à la calsse titi.

    je crois parce que je lui donne un objet et lui il s'attends à un string, ne prenait pas ce que je dis comme acquis , si je savais mon probleme je n'aurai pas posté.

    l'erreur qu'il sort la voila
    Could not synchronize database state with session

    merci de votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    si c'est pas clair dites le moi

  3. #3
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Citation Envoyé par mehdi_swatch

    l'erreur qu'il sort la voila
    Could not synchronize database state with session
    Tu peux afficher l'erreur complete ?
    Ainsi que le mapping de tes deux classes ? et le code du main enregistrant tout ca ! ca serait cool pour t'aider à débugger le tout

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    fichier de mapping de department
    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
    <id
    name="keyDepartment"
    type="string"
    column="key_department">
    </id>
    <version
    column="seq_version"
    name="seqVersion"
    type="long"
    />
    
    <property
    column="lb_department"
    name="lbDepartment"
    type="string" 
    /> 
    
    fichier de mapping de person
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <id
    name="idPerson"
    type="long"
    column="id_person">
    <generator class="hilo"/>
    </id>
    
    <version
    column="seq_version"
    name="seqVersion"
    type="long"
    /> 
     
    <property
    name="login"
    type="string"
    column="login"
    />
    
    <property
    column="first_name"
    name="firstName"
    type="string" 
    />
    <property
    column="last_name"
    name="lastName"
    type="string" 
    />
    
    <property
    column="passwd"
    name="passwd"
    type="string" 
    /> 
     
    <property
    column="dt_begin_authorization"
    name="dtBeginAuthorization"
    type="YearMonthDay" 
    /> 
     
    <property
    column="dt_end_authorization"
    name="dtEndAuthorization"
    type="YearMonthDay" 
    /> 
    <property
    column="pr_daily_cost"
    name="prDailyCost"
    type="double" 
    />
    
    <many-to-one 
    column="key_role" 
    name="role" 
    /> 
    <many-to-one 
    column="key_department" 
    name="department"
    /> 
    
    fichier de mapping de role c'est pareil que departement , les noms changent.

    code de que je veux tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Session session;
     public void saveOrUpdate(PersonDto dto) {
            session.saveOrUpdate(dto);
        }
    la classe de test ou plutot le fonction de test

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
        public void testSaveok(){
     
            PersonDao dao = new PersonDao(session);        
            Person dto = new Person();    
     
            YearMonthDay yearMonthDay = new YearMonthDay();
     
            //Creation RoleDto.
            Role role = new Role();
            role.setKeyRole("CP");
            role.setLbRole("Chef de projet");
            role.setPrDailyCost(5689);
            role.setSeqVersion(1);   
     
            //Creation DepartmentDto
            DepartmentDto department = new DepartmentDto(); 
            department.setKeyDepartment("SUD");
            department.setLbDepartment("est department");
            department.setSeqVersion(1);
     
            //conversion string in date        
            DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
            try {
                Date date = (Date)dateFormat.parse("29-10-2000");
                dto.setDtBeginAuthorization(yearMonthDay.fromDateFields(date));            
                date = (Date)dateFormat.parse("30-10-2000");
                dto.setDtEndAuthorization(yearMonthDay.fromDateFields(date));
            }catch (ParseException e){
     
            }
     
            dto.setIdPerson(3);
            dto.setLogin("toto");
            dto.setFirstName("toto");
            dto.setLastName("toto");
            dto.setPasswd("toto");
            dto.setRole(role);
            dto.setDepartment(department);
            dto.setPrDailyCost(100.50); 
            dto.setSeqVersion(1);
     
     
            Transaction transaction = null; 
     
            try {
                transaction = session.beginTransaction();
                dao.saveOrUpdate(dto);
                transaction.commit();
            }catch (Exception e){
                if (transaction != null){
                    transaction.rollback();
                }
                fail("can't save dto");
            }
     
        }

    c'est quand je teste ce dernier code qu'il me sort de connerie.
    erreur
    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
    47
    48
    49
    50
    Hibernate: 
    update
     person 
    set
    seq_version=?,
    login=?,
    first_name=?,
    last_name=?,
    passwd=?,
    dt_begin_authorization=?,
    dt_end_authorization=?,
    pr_daily_cost=?,
    key_role=?,
    key_department=? 
    where
    id_person=? 
    and seq_version=?
    17:29:42,312 ERROR AbstractFlushingEventListener:299 - Could not synchronize database state with session
    org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [fr.infhotep.senza.reference.person.PersonDto#3]
    at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1635)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2208)
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2118)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2374)
    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:84)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1007)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:354)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at fr.infhotep.senza.reference.person.hibernate.PersonHbnDaoTest.testSaveok(PersonHbnDaoTest.java:192)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
    
    voila tout

  5. #5
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    D'apres ce que je vois, ca semble assez clair, tu crées une personne et celle-ci est enregistrée à l'aide d'une commande update ... alors qu'a mon avis, tu veux l'inserer ... essaie deja d'appeler save(Object o) pour la première fois, afin d'identifier ca cela vient de la ou non ... on approfondira si besoin est

    Pour ce qui est du versionning, je ne sais pas si c'est a toi de le gerer, a mon avis, comme il voit une version, il cherche a mettre a jour l'objet ... essaie de ne pas y toucher ... il me semble que c'est hibernate qui gère cela également ...

    Enfin pour ce qui est des ID ... tu as mis la methode "hilo" qui necessite un complement d'information car c'est une génération assez poussée (va voir ici)
    Si tu ne veux pas t'embeter (car aucune contrainte) prend la méthode "native" qui laisse la BDD se charger de l'identifiant. Toujours est il que, dans les deux cas, tu ne DOIS pas donner d'identifiant à ton objet, c'est encore ici la base de données et/ou hibernate qui s'en chargent !

    Après tout cela, dis moi ce que ces modifs te donnent

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    pour le hilo il marche , je l'ai deja essayé.

    pour les modif que tu m'as dit de faire , j'ai tout mais apparement rien ne change. toujours les memes erreurs.

  7. #7
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Citation Envoyé par mehdi_swatch
    pour le hilo il marche , je l'ai deja essayé.

    pour les modif que tu m'as dit de faire , j'ai tout mais apparement rien ne change. toujours les memes erreurs.
    avec save au lieu de saveOrUpdate, il continue d'executer une requete sous forme d'update ?!? jtrouve ca etrange tout de même :/

    L'erreur indiquée dans ton stacktrace signifie qu'il ne parvient pas a mettre à jour l'enregistrement car celui ci n'existe pas en base (c'est une erreur SQL et non hibernate je pense) ... donc la solution c'est de faire comprendre à Hibernate qu'un insert doit etre réalisé et non un update...

    Bon, le fait que ca ne marche pas n'a pas fait avancé les choses mais au moins, je pense que ton code est plus adapté au concept d'isolation des traitement BDD (après tout, un id est souvent utile pour les BDD au départ ) ...

    Tu peux donc essayer d'afficher le stacktrace en changeant saveOrupdate ?


    Si non, c'est peut etre issu de l'utilisation des versions .... car, comme la version n'existait pas, il se disait que quelqu'un etait venu modifié ou supprimer la ligne avant ... toujours est il que l'erreur source provient surtout de l'update réalisé à la place de l'insert.

    NOTE AUX MODOS : Peut on déplacer ce sujet dans le forum J2EE ?!? histoire que d'autres puissent l'aider également

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

Discussions similaires

  1. Hibernate relation many-to-one
    Par bricecol dans le forum Hibernate
    Réponses: 4
    Dernier message: 09/03/2011, 09h57
  2. Réponses: 2
    Dernier message: 17/07/2006, 14h45
  3. [Hibernate]POJO et many-to-one
    Par azpublic dans le forum Hibernate
    Réponses: 3
    Dernier message: 13/07/2006, 15h00
  4. html:select et hibernate many-to-one
    Par davdou dans le forum Struts 1
    Réponses: 1
    Dernier message: 05/07/2006, 14h56
  5. Hibernate : suppression sur relation many to one
    Par taf dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/05/2006, 13h08

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