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 :

BatchUpdateException: Column 'IdT1' cannot be null


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut BatchUpdateException: Column 'IdT1' cannot be null
    Bonjour j'utilise Hibernate et java pour inserer des objet dans une base mysql:

    J'ai deux tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    T1 : 
    (id ,nom)
     
    T2 :
    (
    id
    titre 
    IdT1  : clé etrnager sur T1).
    J'ai insere un objet OBJ1 dans T1 avec un id =1



    J'utilise un forumlaire ou je saisie un objet OBJ2 : titre et je recupere idT par code .

    je veux persister cet OBJ2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    ....
    OBJ2= new OBJ2();
    OBJ2.setIdT1(id);                             (id = 1)
     
    OBJ2.setTitre("blalala"; 
     
    session.save(OBJ2);
    tx.commit()
    ...
    j'ai cet erreur sur la quelle je seche depuis hier :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    StandardWrapperValve[action]: "Servlet.service()" pour la servlet action a généré une exception
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
    .....
     
     
    Caused by: java.sql.BatchUpdateException: Column 'IdT1' cannot be null
    	at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665)
    	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
    	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
    Avez vous une idée ?

  2. #2
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Fais voir tes fichiers de mappings ainsi que le code de tes objets OBJ1 et OBJ2

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par willoi
    Fais voir tes fichiers de mappings ainsi que le code de tes objets OBJ1 et OBJ2

    alors voila :

    OBJ1
    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
     
     
    <hibernate-mapping>
        <class name="com.prj.OBJ1" table="T1" catalog="prj">
     
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="increment" />
            </id>
            <property name="nom" type="java.lang.String">
                <column name="nom" length="20" not-null="true" />
            </property>
     
     
     
            <set name="T2s" inverse="false">
                <key>
                    <column name="idT1" not-null="true" />
                </key>
                <one-to-many class="com.prj.OBJ2" />
            </set>
        </class>
    </hibernate-mapping>

    et OBJ 2 :

    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
     
    <hibernate-mapping>
        <class name="com.prj.OBJ2" table="T2" catalog="prj">
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="increment" />
            </id>
     
        <many-to-one name="t1" class="com.prj.OBJ1" fetch="select">
                <column name="idT1" not-null="true" />
            </many-to-one>
     
            <property name="titre" type="java.lang.String">
                <column name="titre" length="20" not-null="true" />
            </property>
     
    </hibernate-mapping>

    et j'ai aussi mes OBJ avec des setter et getters


    voila merci pour ton interet

  4. #4
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Dans ton log, on peut voir la requete sql generee? voire le hql ?

    Tu est sur que ton id existe dans ta table T1?

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par willoi
    Dans ton log, on peut voir la requete sql generee? voire le hql ?

    Tu est sur que ton id existe dans ta table T1?

    c'est bon je l'ai resolu.

    merci

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Dire comment c'est bien pour les gens qui vont rechercher le même genre de choses ...
    Et le tag , c'est bien aussi

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par chtig
    Dire comment c'est bien pour les gens qui vont rechercher le même genre de choses ...
    Et le tag , c'est bien aussi

    merci beaucoup mais la j'ai une autre erreur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    org.hibernate.QueryException: could not resolve property: idT1 of: com.prj.OBJ2 [select q from com.prj.OBJ2  as q order by q.idT1  ]
    
    	org.hibernate.persister.entity.AbstractPropertyMapping.throwPropertyException(AbstractPropertyMapping.java:43)
    	org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:37)
    	org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1265)
    	org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:279)
    	org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:372)
    	org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:539)
    	org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:221)
    Est-ce que cela vous parle ?

    merci

  8. #8
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    J'ai comme l'impression que tu utilises la logique du JDBC brut avec Hibernate !

    J'explique : tu touches directement aux clés étrangères en utilisant des identifiants .... : c'est du JDBC brut ça ...
    Le but d'utiliser Hibernate c'est faire l'abstraction sur les détails du persistance (surtout les clés étrangères et compagnie).

    Dans ton cas, ça reviendrait à remplacer le champ idT1 dans OBJ2 par OBJ1 tout court, et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    OBJ1 = XXXX;//à toi de voir
    OBJ2= new OBJ2();
    OBJ2.setObj1(OBJ1);
     
    OBJ2.setTitre("blalala"); 
     
    session.save(OBJ2);
    tx.commit()
    Et là, Hibernate va se débrouiller pour persister cette relation : C'est à lui de gérer les clés étrangères, pas à toi.

    Pour ta seconde question, ça revient presque à ce que je viens de te dire : avec Hibernate (et HQL), tu dois penser en termes d'objets et de propriétés, pas en terme de tables et colonnes ...
    en gros, t'as fait une chose du genre :
    from OBJ2 o2 where o2.idT1=?;
    or, ça, c'est du SQL, pas de HQL ! Si tu fais comme je te l'ai dit précédemment et que tu ajoutes un champ OBJ1 dans OBJ, ta requette devient alors :
    from OBJ2 o2 where o2.obj1.id=?;
    Voilà. T'aurais pu quand même fournir ta requête au lieu de nous laisser la deviner ....

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Modjo
    J'ai comme l'impression que tu utilises la logique du JDBC brut avec Hibernate !

    J'explique : tu touches directement aux clés étrangères en utilisant des identifiants .... : c'est du JDBC brut ça ...
    Le but d'utiliser Hibernate c'est faire l'abstraction sur les détails du persistance (surtout les clés étrangères et compagnie).

    Dans ton cas, ça reviendrait à remplacer le champ idT1 dans OBJ2 par OBJ1 tout court, et ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    OBJ1 = XXXX;//à toi de voir
    OBJ2= new OBJ2();
    OBJ2.setObj1(OBJ1);
     
    OBJ2.setTitre("blalala"); 
     
    session.save(OBJ2);
    tx.commit()
    Et là, Hibernate va se débrouiller pour persister cette relation : C'est à lui de gérer les clés étrangères, pas à toi.

    Pour ta seconde question, ça revient presque à ce que je viens de te dire : avec Hibernate (et HQL), tu dois penser en termes d'objets et de propriétés, pas en terme de tables et colonnes ...
    en gros, t'as fait une chose du genre :


    or, ça, c'est du SQL, pas de HQL ! Si tu fais comme je te l'ai dit précédemment et que tu ajoutes un champ OBJ1 dans OBJ, ta requette devient alors :


    Voilà. T'aurais pu quand même fournir ta requête au lieu de nous laisser la deviner ....
    Ma requete est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    select q from com.prj.OBJ2  as q order by q.idT1

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    from OBJ2 as o    where  O.OBJ1.id =?
    sans succes
    j'ai fait ce que tu as dit mais j'ai tjrs cette erreur!

  10. #10
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Citation Envoyé par moi
    o2.obj1.id
    réfléchis en terme d'objets :

    Il faut bien sur adapter obj1 pour représenter le nom du champ de type OBJ1 dans OBJ2.

    Le mieux serait de revoir un cours sur Hibernate et les relations.

    Bonne chance.

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Modjo
    réfléchis en terme d'objets :

    Il faut bien sur adapter obj1 pour représenter le nom du champ de type OBJ1 dans OBJ2.

    Le mieux serait de revoir un cours sur Hibernate et les relations.

    Bonne chance.
    sa marche tjrs pas !

    Merci

    je lache l'affaire !

    Effectievement je vais voir un cours!

  12. #12
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Modjo
    réfléchis en terme d'objets :

    Il faut bien sur adapter obj1 pour représenter le nom du champ de type OBJ1 dans OBJ2.

    Le mieux serait de revoir un cours sur Hibernate et les relations.

    Bonne chance.
    Je viens de reoudre le problème grace a tes explications et au cours de hibernate du site hibernate.com.

    merci

  13. #13
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par MASSAKA
    Je viens de reoudre le problème grace a tes explications et au cours de hibernate du site hibernate.com.

    merci
    Maintenat ce que j'essai de faire est de supprimer un OBJ1, donc je doit commencer par supprimer tous les objet OBJ2 se rapportant a cet OBJ1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    Je recupere l'id de lOBJ1 a supprmier,
     
    pour cet id je recupere tout les objets OBJ2 ayant id=idT1
     
    puis je supprime tous ces objet avec session delete.
    et je supprime  finalement OBJ1
     
    est-ce ça??
    Comment s'y prendre , merci pour les idées?

  14. #14
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 225
    Points : 85
    Points
    85
    Par défaut
    J'ai eu cette erreur quand je fais un session.save

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.prj.OBJ2.obj1list, no session or session was closed
    ...
    Merci pour vos lumières!

Discussions similaires

  1. Integrity constraint violation: 1048 Column 'abc' cannot be null
    Par Elwood J. Blues dans le forum Doctrine2
    Réponses: 6
    Dernier message: 13/06/2015, 16h43
  2. Réponses: 2
    Dernier message: 16/03/2013, 18h06
  3. Réponses: 2
    Dernier message: 14/08/2011, 14h25
  4. Réponses: 2
    Dernier message: 24/06/2008, 16h30
  5. Column 'col' cannot be null
    Par jeyce dans le forum Hibernate
    Réponses: 2
    Dernier message: 02/08/2007, 17h27

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