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 :

Jointure avec hibernate


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 18
    Points : 8
    Points
    8
    Par défaut Jointure avec hibernate
    Bonjour,

    Je travaille actuellement sur un projet J2EE avec Struts/Spring/Hibernate. Je débute en hibernate et me retrouve bloqué pour la gestion des clé étrangère avec jointure.
    A l'aide de quelques infos sur le net j'ai, rajouté ceci au fichier hbm correspondant à ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    <many-to-one name="useremetteur"
                column="fk_idUserEmetteur"
                class="Users"/>
    ...
    J'ai donc aussi rajouté les accesseurs à mon bean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private com.labosun.bo.Users useremetteur;
     
    public void setUseremetteur(com.labosun.bo.Users user){
    			this.useremetteur = user;
    		}
     
    		public com.labosun.bo.Users getUseremetteur(){
    			return useremetteur;
    		}
    Le problème est que lorsque je fais appel à mon getter j'obtiens cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.NoSuchMethodError: com.labosun.bo.PrivateMessages.getUseremetteur()Lcom/labosun/bo/Users;
    J'ai oublié quelque chose ?

  2. #2
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    c'est bien sur le bean PrivateMessages que t'as ajouté ces getter/setter? T'as bien recompilé et uploadé dans ta webapp la classe recompilée? Ta bien rechargée la webapp?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    J'ai bien réglé le problème. J'avais apparemment oublié de changer un accesseur auquel je faisais appel.
    Maintenant, tout fonctionne dans la récupération de mon objet. Par contre, maintenant je ne peux plus sauvegarder d'objet :-(
    Voilà l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    javax.servlet.ServletException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    Je fais bien passer mon objet User à mon objet PrivateMessage et apparemment il aime pas :-(

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Code XML : 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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
     
    <hibernate-mapping package="com.labosun.bo">
    	<class
    		name="PrivateMessages"
    		table="privateMessages"
    	>
    		<meta attribute="sync-DAO">false</meta>
    		<id
    			name="id"
    			type="integer"
    			column="idPrivateMessage"
    		>
    			<generator class="increment"/>
    		</id>
     
    		<property
    			name="titlePrivateMessage"
    			column="titlePrivateMessage"
    			type="string"
    			not-null="true"
    			length="30"
    		/>
    		<property
    			name="contenuPrivateMessage"
    			column="contenuPrivateMessage"
    			type="string"
    			not-null="true"
    		/>
    		<property
    			name="datePrivateMessage"
    			column="datePrivateMessage"
    			type="timestamp"
    			not-null="true"
    		/>
     
    		<many-to-one name="useremetteur"
                column="fk_idUserEmetteur"
                class="Users"/>
     
            <many-to-one name="userrecipient"
                column="fk_idUserRecipient"
                class="Users"/>
     
    	</class>	
    </hibernate-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
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    public class PrivateMessages{
     
    		java.lang.Integer id;
    		java.lang.String titlePrivateMessage;
    		java.lang.String contenuPrivateMessage;
    		java.util.Date datePrivateMessage;
    		com.labosun.bo.Users useremetteur;
    		com.labosun.bo.Users userrecipient;
    		/**
                     * @return the id
                     */
    		public java.lang.Integer getId() {
    			return id;
    		}
    		/**
                     * @param id the id to set
                     */
    		public void setId(java.lang.Integer id) {
    			this.id = id;
    		}
    		/**
                     * @return the titlePrivateMessage
                     */
    		public java.lang.String getTitlePrivateMessage() {
    			return titlePrivateMessage;
    		}
    		/**
                     * @param titlePrivateMessage the titlePrivateMessage to set
                     */
    		public void setTitlePrivateMessage(java.lang.String titlePrivateMessage) {
    			this.titlePrivateMessage = titlePrivateMessage;
    		}
    		/**
                     * @return the contenuPrivateMessage
                     */
    		public java.lang.String getContenuPrivateMessage() {
    			return contenuPrivateMessage;
    		}
    		/**
                     * @param contenuPrivateMessage the contenuPrivateMessage to set
                     */
    		public void setContenuPrivateMessage(java.lang.String contenuPrivateMessage) {
    			this.contenuPrivateMessage = contenuPrivateMessage;
    		}
    		/**
                     * @return the datePrivateMessage
                     */
    		public java.util.Date getDatePrivateMessage() {
    			return datePrivateMessage;
    		}
    		/**
                     * @param datePrivateMessage the datePrivateMessage to set
                     */
    		public void setDatePrivateMessage(java.util.Date datePrivateMessage) {
    			this.datePrivateMessage = datePrivateMessage;
    		}
     
    		public void setUseremetteur(com.labosun.bo.Users user){
    			this.useremetteur = user;
    		}
     
    		public com.labosun.bo.Users getUseremetteur(){
    			return useremetteur;
    		}
     
    		public void setUserrecipient(com.labosun.bo.Users user){
    			this.userrecipient = user;
    		}
     
    		public com.labosun.bo.Users getUserrecipient(){
    			return userrecipient;
    		}
     
    }
    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
    public class EnvoiMessage extends Action {
     
    	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response)throws Exception 
    	{ 
    		NewPrivateMessageForm formulaire = (NewPrivateMessageForm) form;
    		Users user = formulaire.getUser();
    		PrivateMessages message = formulaire.getPrivateMessage();
     
    		ApplicationContext beanFactory = new ClassPathXmlApplicationContext("applicationContext-*.xml");
     
    		user = ((UsersDAO) beanFactory.getBean("Users")).getUserByPseudo(user.getPseudoUser());
     
    		if(user != null && message.getTitlePrivateMessage() != null && message.getContenuPrivateMessage() != null){
    			message.setDatePrivateMessage(new Date());
    			message.setUseremetteur((Users) request.getSession().getAttribute("userConnected"));
    			message.setUserrecipient(user);
     
    			((PrivateMessagesDAO) beanFactory.getBean("PrivateMessages")).saveAndGet(message);
     
    			return mapping.findForward("SUCCESS");
    		}
    		return mapping.findForward("ERROR");
    	}
    }

  5. #5
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    utilise update ou saveorupdate pour les objets déjà existant. save, c'est uniquement pour les nouveaux objets. Dans ton cas, t'as violé (méchant va!) un contrainte de clé primaire de ta db, probablement parce que tu tente de sauver une deuxième fois un objet. Sans avoir le root cause de ton exception (avec son stacktrace) et le code correspondant, difficile de dire plus.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Dans mon cas, je ne met pas à jour mon objet. Je le crée ! Le code fonctionnait lorsque je n'utilisait pas les many-to-one et que je déclarais les clé étrangères en tant que simple property de type integer.

    Voici la trace complète :
    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
    type Rapport d'exception
     
    message
     
    description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.
     
    exception
     
    javax.servlet.ServletException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
     
    cause mère
     
    org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    	org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:622)
    	org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    	org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:377)
    	org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:632)
    	com.labosun.dao.impl.DAOHibernate.saveAndGet(DAOHibernate.java:29)
    	com.labosun.module.privatemessage.EnvoiMessage.execute(EnvoiMessage.java:37)
    	org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
    	org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
     
    cause mère
     
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    	org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    	org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
    	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
    	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
    	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    	org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
    	org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373)
    	org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:632)
    	com.labosun.dao.impl.DAOHibernate.saveAndGet(DAOHibernate.java:29)
    	com.labosun.module.privatemessage.EnvoiMessage.execute(EnvoiMessage.java:37)
    	org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
    	org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

  7. #7
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    ta relation a un cascade qui crée les objet récursivement?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Je débute en hibernate... et je ne travail pas seul sur le projet. De ce qu'il me semble avoir vu, la création en cascade doit être spécifié dans la balise many-to-one non ? Le hbm correspondant à l'objet que je veux rajouté est le même que celui que j'ai donné plus haut. Si je dois regarder ailleurs, merci de me dire où.

    Et merci encore pour m'aider

  9. #9
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    pour faire simple, met cascade=all dans many-to-one, et je t'invite à jeter un oeil dans la doc hibernate sur les types de cascade possible et leur conséquence.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 18
    Points : 8
    Points
    8
    Par défaut
    Oki, j'essaierai de chercher un peu plus. Si tu as une où plusieurs docs à proposer, je suis preneur

    Je testerais ce soir de mettre l'option cascade à all. Mais en attendant, une petite question pour ma compréhension ^^
    Dans ce que je comprend, cascade all veut dire que les mises à jours et créations doivent être faites en cascade. Donc dans mon cas si je fais ça, il va me créer mon User en même temps que mon PrivateMessage non ?
    Si c'est le cas sachant que mon User est déjà existant, pourquoi cela règlerait mon problème ?

    Merci !!!

  11. #11
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Ca réglerait le problème si il viens du fait que l'objet pointé vers ta clé étrangère quand tu sauve n'a lui, pas encore été créé -> constraint violation sur la clé étrangère.

    Si c'est pas le cas, faudra arriver à déterminer quelle contrainte exactement est violée pour résoudre le prob.

Discussions similaires

  1. Jointure avec Hibernate
    Par bylka dans le forum Hibernate
    Réponses: 39
    Dernier message: 01/09/2011, 11h57
  2. jointure de deux tables avec hibernate
    Par Palsajicoco dans le forum Hibernate
    Réponses: 0
    Dernier message: 04/05/2011, 17h03
  3. [Hibernate 3] [Criteria] Faire une jointure avec Criteria
    Par bouchette63 dans le forum Hibernate
    Réponses: 30
    Dernier message: 07/06/2010, 17h54
  4. Jointure entre 2 class avec Hibernate
    Par yassineelouardi dans le forum Hibernate
    Réponses: 5
    Dernier message: 21/07/2009, 15h40
  5. Jointure avec Hibernate via Criteria
    Par Spir dans le forum Hibernate
    Réponses: 3
    Dernier message: 05/03/2008, 15h12

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