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 :

probleme de mapping id 'assigned'


Sujet :

Hibernate Java

  1. #1
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut probleme de mapping id 'assigned'
    Bonjour,
    je commence avec Hibernate. Je suis en train de le tester avec Eclipse 3.2, hibernate 3, et une base MySQL5.

    Je n'arrive pas a avoir un mapping de mon objet JAVA correct, j'ai tout le temps l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): net.yozine.Utilisateur
    ma classe net.yozine.Utilisateur:
    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
    package net.yozine;
     
    import java.io.Serializable;
     
    public class Utilisateur implements Serializable {
     
        private Long id;
    	private String email;
    	private String nom;
    	private String prenom;
    	private Adresse adresse = new Adresse();
    	private String telDom;
    	private String telPort;
     
    	public Utilisateur() {}   // constructeur sans arguments
     
        public Long getId() {
            return id;
        }
     
        private void setId(Long id) {   // permet a hibernate d'initialiser l'id
            this.id = id;
        }
     
    	public Adresse getAdresse() {
    		return adresse;
    	}
    	public void setAdresse(Adresse adresse) {
    		this.adresse = adresse;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public String getNom() {
    		return nom;
    	}
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
    	public String getPrenom() {
    		return prenom;
    	}
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}
    	public String getTelDom() {
    		return telDom;
    	}
    	public void setTelDom(String telDom) {
    		this.telDom = telDom;
    	}
    	public String getTelPort() {
    		return telPort;
    	}
    	public void setTelPort(String telPort) {
    		this.telPort = telPort;
    	}
     
    }
    le code de géneration de ma tableMySQL5:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE `utilisateur` (
      `email` varchar(30) NOT NULL,
      `nom` varchar(30) NOT NULL,
      `prenom` varchar(30) NOT NULL,
      `cp` varchar(5) default NULL,
      `teldom` varchar(10) default NULL,
      `telport` varchar(10) default NULL,
      `rue` varchar(50) default NULL,
      `ville` varchar(30) default NULL,
      PRIMARY KEY  (`email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    et enfin mon fichier de mapping:
    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
      <class name="net.yozine.Utilisateur" table="`utilisateur`" >
     
            <id name="email" type="string" column="`email`" >
            	<generator class="assigned" />
            </id>
     
      	<property name="nom" />
      	<property name="prenom" />
      	<property name="telDom" column="teldom" />
      	<property name="telPort" column="telport" />
      	<component name="adresse" class="net.yozine.Adresse">
      		<property name="rue" />
      		<property name="cp" />
      		<property name="ville" />
      	</component>
      </class>
    </hibernate-mapping>
    Merci, de votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut
    Bonjour,

    le fait que tu mettes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <id name="email" type="string" column="`email`" >
         <generator class="assigned" />
    </id>
    signifie que tu dois préciser toi même l'identifiant de ton utilisateur (ici l'email). Autrement dit, il faut que tu fasses un monUtilisateur.setEmail() avant d'enregistrer monUtilisateur en base de données.

    MiniMarch

  3. #3
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    en fait j'utilise STRUTS pour l'architecture du formulaire. Donc j'ai une servlet d'action qui recupere les valeurs saisies dans un formulaire jsp, et qui les copie dans le bean 'Utilisateur'.. Donc a priori le setEmail() devrait etre effectué a ce moment.

    Le code de la classe d'action STRUTS:
    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
    package net.yozine.action;
     
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.util.List;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.ServletException;
     
    import net.yozine.Utilisateur;
    import net.yozine.dao.HibernateDAOFactory;
    import net.yozine.form.HiberTestForm;
    import net.yozine.interfaces.UtilisateurDAO;
     
    import org.apache.commons.beanutils.BeanUtils;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
     
    public class HiberAction extends Action {
     
    public ActionForward execute(ActionMapping mapping,
    								ActionForm form, 
    								HttpServletRequest request, 
    								HttpServletResponse response)
    								throws IOException, ServletException, 
    								IllegalAccessException, InvocationTargetException {
     
     
    		HibernateDAOFactory myFactory;
    		myFactory = new HibernateDAOFactory();
    		UtilisateurDAO user = myFactory.getUtilisateurDAO();
     
    		// Ajoute l'utilisateur dans la base
    		// necessite l'emploi d'un formBean
     
    		HiberTestForm myForm = (HiberTestForm) form;
    		Utilisateur myUser = new Utilisateur();
    		BeanUtils.copyProperties(myUser, myForm);
     
    		user.insertUtilisateurDAO(myUser);
     
    		// Liste les utilisateurs existants
     
    		List userList = user.listUtilisateurDAO();
     
    		Utilisateur[] users = new Utilisateur[userList.size()];		
    		for (int i=0; i < userList.size(); i++) {
    			users[i] = (Utilisateur) userList.get(i);
    		}
     
    		request.getSession().setAttribute("dao", users);
     
    		String target = "success";
    		return mapping.findForward(target);
    	}
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut
    A chaque fois que j'ai eu un problème de ce genre, et que je me suis dit "a priori", je l'ai eu dans l'os...

    Essaye de voir si la valeur est effectivement passée (une erreur de frappe qui empêche le binding, ça va vite...).

    Au hasard, je dirais System.out.println(myUser.getEmail) juste avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    user.insertUtilisateurDAO(myUser);

  5. #5
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    C'est exactement ce que je suis en train de faire, un bon vieux system.out.print()

  6. #6
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    bien vu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("******** val de email: "+ myUser.getEmail() +" *********");
    m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ******** val de email: null *********
    je vais etudier ca de plus pres apres manger, merci

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut
    De rien. Bon ap'

  8. #8
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    Merci (j'en ai marre de manger des pates)

    bon voilou, de retour, je n'ai plus l'erreur, et j'affiche bien l'adresse mail passée en parametre par le formulaire, c'etait une erreur purement 'SRUTS' en fait.

    Par contre j'ai encore qqch qui ne tourne pas puisque la console affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hibernate: insert into `utilisateur` (nom, prenom, telDom, telPort, rue, cp, ville, `email`) values (?, ?, ?, ?, ?, ?, ?, ?)

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Ce n'est pas une erreur.
    C'est juste une trace de la requête sql générée par Hibernate.
    Tu peux le desactiver via ton fichier de config et le paramètre
    show_sql.

  10. #10
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    en fait c'est bien ce qui m inquiete, c'est qu'il n'insere pas les valeurs, puisqu'il ne les connait pas, mais ne genere pas d'erreur.

    Donc pour trouver la source d'erreur, ca va pas etre evident

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Comment ça, il ne les connait pas ?
    Tu dis ça à cause des points d'interrogations ?
    Si c'est le cas, ça ne veut pas dire qu'Hibernate ne connait pas les valeurs, c'est juste qu'il ne les affiche pas.
    Pour les voir dans les logs, il faut activer log4j et l'option adéquate.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut
    Ce que veut dire fr1man c'est que la requête que tu vois est celle exécutée par Hibernate. Si aucune erreur n'est survenue, c'est que la requête a été exécutée avec succès.

    Les ? dans la requête sont en réalité remplacés par les bonnes valeurs (même si tu ne le vois pas à l'écran).

    Vérifie bien en base que tes données ont été insérées. Normalement, c'est bon.

  13. #13
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    Oui justement je n'ai pas d'enregistrement dans la base

  14. #14
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    si je relance la jsp du formulaire, j'ai egalement une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ******** val de email: euan_m@yahoo.fr *********
    Hibernate: insert into `utilisateur` (nom, prenom, telDom, telPort, rue, cp, ville, email) values (?, ?, ?, ?, ?, ?, ?, ?)
    3 oct. 2007 16:16:53 org.hibernate.util.JDBCExceptionReporter logExceptions
    ATTENTION: SQL Error: 1062, SQLState: 23000
    3 oct. 2007 16:16:53 org.hibernate.util.JDBCExceptionReporter logExceptions
    GRAVE: Duplicate entry 'euan_m@yahoo.fr' for key 1
    3 oct. 2007 16:16:53 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
    GRAVE: Could not synchronize database state with session
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GRAVE: Duplicate entry 'euan_m@yahoo.fr' for key 1
    Change d'email...

  16. #16
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    en effet c'est juste, hibernate a identifie que ma clef est dupliquée.. mais ca m'etonne puisque je n'ai aucun enregistrement dans la table.

    Donc je ne comprend pas comment il peut le voir, a moins qu'il regarde dans ses fichiers de log, si l'email a deja ete utilisé.

    J'ai passé en revue les differentes option, je ne vois rien pour log4j:
    http://www.hibernate.org/hib_docs/re...iguration.html

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Par défaut
    Ils sont forcément en base... Tu regardes bien la bonne base de données ? dans la bonne table ?

  18. #18
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut
    Quand tu lance une appli J2EE dans eclipse, un cache de ton appli est créé dans un répertoire de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LE_REPERTOIRE_PARENT_DE_TON_PROJET\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
    La base devrait aussi se trouver dans cette arborescence et c'est celle-ci qui est modifiée.

    A+

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    http://www.hibernate.org/hib_docs/v3...ration-logging

    C'est bizarre, moi j'ai trouvé...

  20. #20
    Membre très actif
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    Citation Envoyé par Mister Nono Voir le message
    Quand tu lance une appli J2EE dans eclipse, un cache de ton appli est créé dans un répertoire de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LE_REPERTOIRE_PARENT_DE_TON_PROJET\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
    La base devrait aussi se trouver dans cette arborescence et c'est celle-ci qui est modifiée.

    A+
    je n'ai pas de rep '/wtpwebapps' au bout du chemin

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/07/2006, 14h45
  2. [Hibernate] Problème de mapping ?
    Par n@n¤u dans le forum Hibernate
    Réponses: 3
    Dernier message: 13/06/2006, 08h45
  3. Problem de Map et de List
    Par Roming22 dans le forum C++
    Réponses: 5
    Dernier message: 29/05/2006, 11h29
  4. [hibernate] probleme de mapping un-vers-plusieurs
    Par Elmilouse dans le forum Hibernate
    Réponses: 2
    Dernier message: 12/04/2006, 13h37
  5. Un petit probleme de map()
    Par cryptorchild dans le forum Langage
    Réponses: 2
    Dernier message: 04/12/2005, 13h00

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