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

Collection et Stream Java Discussion :

Problème Hibernate de mapping bidirectionnel avec joined-class et/ou problème GWT avec RPC


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut Problème Hibernate de mapping bidirectionnel avec joined-class et/ou problème GWT avec RPC
    Bonjour,

    J'ai un souci, je n'arrive pas à réaliser un mapping entre deux classes.

    Contexte :
    J'ai un modèle de données avec les entités Candidate et Mobility. Chaque Candidate peut avoir plusieurs Mobility (Nantes, Paris, Strasbourg,...).
    Et chaque mobilité peut correspondre à plusieurs candidats.

    J'ai donc une relation bidirectionnelle.

    Dans la base de données j'ai donc une table d'association CandidateMobility.

    Mais le problème c'est que j'arrive à faire le mapping dans un sens mais pas dans l'autre :
    De candidate vers Mobility j'ai ça comme code : Mobility est une classe qui hérite de simpleEntity. Je ne sais pas si le problème vient de là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        <class name="com.avisto.recruter.shared.model.Candidate" table="Candidate">
        	<id name="id" column="id">
                <generator class="sequence">
       		<param name="sequence">hibernate_sequence</param>
      	    </generator>
            </id>
    ...
    	<list name="mobility" lazy="false" table="CandidateMobility"> 
          		<key column="ca_id" />
          	        <list-index column="idx"/>
    		<many-to-many class="com.avisto.recruter.shared.model.Mobility" column="id_entity"/> 
        	</list>  		
        </class>
    Ca à l'air de fonctionner. Je peut faire persister une liste de Mobility pour un Candidate.

    En revanche de l'autre coté voilà ce que j'essaye de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        <class name="com.avisto.recruter.shared.model.SimpleEntity" table="SimpleEntity">
        	<id name="id" column="id_entity">
                <generator class="sequence">
       		<param name="sequence">hibernate_sequence</param>
      	   </generator>
            </id>
            <joined-subclass name="com.avisto.recruter.shared.model.Mobility" table="Mobility" >
    		<key column="id_entity"/>
    		<set name="candidates" lazy="false" table="CandidateMobility" inverse="true"> 
    	      		<key column="id_entity" />
    			<many-to-many class="com.avisto.recruter.shared.model.Candidate" column="id"/> 
        		</set>
    	</joined-subclass>	
        </class>
    Après l'ajout de cette balise <set> dans cet élément, les données ont l'air de pouvoir toujours être récupérées par hibernate car coté serveur je peut récupérer une liste d'objet Mobility.
    Mais la procédure (Remote Procedure Call) qui les envoie coté client (technologie GWT) échoue systématiquement.

    Je ne saurai pas dire si le problème vient simplement du mapping hibernate (si quelqu'un pouvait le valider) ou si c'est lié à GWT qui a des incompatibilités avec hibernate.

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Salut,

    Cela pourra peut-être t'aider, hibernate dans les cours et tutoriels pour apprendre Java : http://java.developpez.com/cours/ ou encore la FAQ hibernate : http://java.developpez.com/faq/

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Merci mais malheureusement ce document ne traite pas des relations many-to-many qui concernent mon cas.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Oui certes c'est ballot ^^.

    Normalement, dans le mapping c'est comme one-to-one(many-to-many) dans les exemples...

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Il n'y a personne d'un peu expérimenté en Hibernate qui pourrait au moins valider mon mapping? Que je sache si l'erreur vient de là ou non

  6. #6
    Membre confirmé Avatar de ruscov
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2007
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2007
    Messages : 347
    Points : 500
    Points
    500
    Par défaut
    Tu n'as pas des logs d'erreurs à nous proposer?
    Mes logiciels n’ont jamais de bug. Ils développent juste certaines fonctions aléatoires.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Voilà la sortie que j'ai dans la console :

    14:39:16,989 [DEBUG ] Le chargeur de classe parent (class loader) est: ContextLoader@null
    14:39:16,989 [DEBUG ] Le répertoire de travail (scratch dir) pour le moteur de JSP est: C:\DOCUME~1\guillet\LOCALS~1\Temp\Jetty_127_0_0_1_8888_webapp____dyi761\jsp
    14:39:16,989 [DEBUG ] IMPORTANT: Ne pas modifier les servlets générées
    14:39:30,740 [ INFO ] Entering connectUser('guillet'/<hidden password>)
    14:39:31,021 [ INFO ] MLog clients using log4j logging.
    14:39:33,381 [ INFO ] 29 administrators loaded
    14:39:33,427 [ INFO ] connectUser('guillet'/<hidden password>) SUCCEEDED
    14:39:33,427 [ INFO ] User guillet connected with right: user_right_view_candidates
    14:39:33,427 [ INFO ] User guillet connected with right: user_right_view_reports
    14:39:33,427 [ INFO ] User guillet connected with right: user_right_administrate
    14:39:33,427 [ INFO ] User guillet connected with right: user_right_view_statistic
    14:39:34,943 [ INFO ] 8 availabilities loaded
    14:39:34,943 [ INFO ] Connection = [com.avisto.recruter.shared.model.Availability@ec2178, com.avisto.recruter.shared.model.Availability@5cbe8a, com.avisto.recruter.shared.model.Availability@15acf7d, com.avisto.recruter.shared.model.Availability@896559, com.avisto.recruter.shared.model.Availability@e16cc6, com.avisto.recruter.shared.model.Availability@1ac7b37, com.avisto.recruter.shared.model.Availability@cd7262, com.avisto.recruter.shared.model.Availability@5f671e]
    14:39:35,115 [ INFO ] 12 experiences loaded
    14:39:35,115 [ INFO ] 4 elsys entities loaded
    14:39:35,178 [ INFO ] 4 contract types loaded
    14:39:35,271 [ INFO ] 34 responsibles loaded
    14:39:35,287 [ INFO ] 4 queries loaded
    14:39:35,287 [ INFO ] Entering findAllViews
    14:39:35,396 [ INFO ] 18 sources loaded
    14:39:35,396 [ INFO ] 27 specialities loaded
    14:39:35,412 [ WARN ] Servlet configuration parameter 'symbolMaps' specifies directory 'WEB-INF/recruter/symbolMaps/' which does not exist or is not relative to your server's current working directory 'C:\Documents and Settings\guillet\workspace\Recruter'
    14:39:35,412 [ WARN ] In order to enable stack trace deobfuscation, please specify the 'symbolMaps' <init-param> for the com.allen_sauer.gwt.log.server.RemoteLoggerServlet servlet in your web.xml
    14:39:35,474 [ INFO ] 60 universities loaded
    14:39:35,459 [ INFO ] 15 views loaded
    14:39:35,412 [ INFO ] 11 statuses loaded
    14:39:35,615 [ INFO ] 6 mobilities loaded
    14:39:35,631 [ INFO ] connect => onSuccess
    dans RecruterDatasource.executefetch() : query.toSQLString()SELECT c FROM Candidate c INNER JOIN c.status as status_alias_0 WHERE ((upper(status_alias_0.name) LIKE '%STAGIAIRE%' OR upper(status_alias_0.name) LIKE '%SUR PROJET%' OR upper(status_alias_0.name) LIKE '%SUR PROFIL%' OR upper(status_alias_0.name) LIKE '%SUR PROJET / SUR PROFIL%' OR upper(status_alias_0.name) LIKE '%SOURC�%'))
    14:39:36,459 [ INFO ] RecruterDaoImpl.getCandidates() hqlQuery: 'SELECT c FROM Candidate c INNER JOIN c.status as status_alias_0 WHERE ((upper(status_alias_0.name) LIKE '%STAGIAIRE%' OR upper(status_alias_0.name) LIKE '%SUR PROJET%' OR upper(status_alias_0.name) LIKE '%SUR PROFIL%' OR upper(status_alias_0.name) LIKE '%SUR PROJET / SUR PROFIL%' OR upper(status_alias_0.name) LIKE '%SOURC�%'))'
    14:39:36,490 [ INFO ] getAllAvailabilities => onSuccess (8)
    14:39:36,490 [ INFO ] getAllExperiences => onSuccess (12)
    14:39:36,490 [ INFO ] getAllElsysEntities => onSuccess (4)
    14:39:36,490 [ INFO ] getAllContractTypes => onSuccess (4)
    14:39:36,490 [ INFO ] getAllResponsible => onSuccess (34)
    14:39:36,490 [ INFO ] getAllQueries => onSuccess (4)
    14:39:36,490 [ INFO ] getAllSources => onSuccess (18)
    14:39:36,490 [ INFO ] getAllSpecialities => onSuccess (27)
    14:39:36,490 [ INFO ] getAllViews => onSuccess (15)
    14:39:36,490 [ INFO ] filter = Tous les candidats actifs
    14:39:36,490 [ INFO ] filter = Tous les candidats sourcés
    14:39:36,490 [ INFO ] filter = Tous les candidats
    14:39:36,490 [ INFO ] filter = Tous mes candidats actifs
    14:39:36,490 [ INFO ] filter = Tous mes candidats sourcés
    14:39:36,490 [ INFO ] filter = Tuyau Elsys
    14:39:36,490 [ INFO ] filter = Tuyau Avisto
    14:39:36,490 [ INFO ] filter = Tuyau Paris
    14:39:36,490 [ INFO ] filter = Tuyau Aix
    14:39:36,490 [ INFO ] filter = Tuyau Nice
    14:39:36,490 [ INFO ] filter = Tuyau Rennes
    14:39:36,490 [ INFO ] filter = Tuyau Toulouse
    14:39:36,490 [ INFO ] filter = Tuyau Grenoble
    14:39:36,490 [ INFO ] filter = Tous les candidats à relancer
    14:39:36,490 [ INFO ] filter = Tous mes candidats à relancer
    14:39:36,490 [ INFO ] columns :
    14:39:36,490 [ INFO ] > dateAppointment1
    14:39:36,490 [ INFO ] > lastName
    14:39:36,490 [ INFO ] > firstName
    14:39:36,490 [ INFO ] > status
    14:39:36,490 [ INFO ] > responsible
    14:39:36,490 [ INFO ] > mixedAvailability
    14:39:36,490 [ INFO ] > mobility
    14:39:36,490 [ INFO ] > experience
    14:39:36,490 [ INFO ] > speciality
    14:39:36,490 [ INFO ] selected View = Tous les candidats actifs
    14:39:36,490 [ INFO ] selected View = Tous les candidats actifs
    14:39:36,490 [ INFO ] columns :
    14:39:36,490 [ INFO ] > dateAppointment1
    14:39:36,490 [ INFO ] > lastName
    14:39:36,490 [ INFO ] > firstName
    14:39:36,490 [ INFO ] > status
    14:39:36,490 [ INFO ] > responsible
    14:39:36,490 [ INFO ] > mixedAvailability
    14:39:36,490 [ INFO ] > mobility
    14:39:36,490 [ INFO ] > experience
    14:39:36,490 [ INFO ] > speciality
    14:39:36,490 [ INFO ] selected View = Tous les candidats actifs
    14:39:36,490 [DEBUG ] Looking for results with filter ''
    14:39:36,490 [DEBUG ] Creating alias for 'status
    14:39:36,490 [DEBUG ] status_alias_0.name LIKE '%Stagiaire%'
    14:39:36,490 [DEBUG ] status_alias_0.name LIKE '%Sur Projet%'
    14:39:36,490 [DEBUG ] status_alias_0.name LIKE '%Sur Profil%'
    14:39:36,490 [DEBUG ] status_alias_0.name LIKE '%Sur Projet / Sur Profil%'
    14:39:36,490 [DEBUG ] status_alias_0.name LIKE '%Sourc�%'
    14:39:36,490 [ INFO ] getAllUniversity => onSuccess (60)
    14:39:36,490 [ INFO ] getAllStatus => onSuccess (11)
    14:39:36,490 [ INFO ] getAllMobilities => onFailure: 500 The call failed on the server; see server log for details
    14:39:36,490 [ WARN ] connection faileur on: getAllMobilities
    14:39:41,178 [ INFO ] getCandidatCountFilters => onSuccess '218' results available
    14:39:41,178 [ INFO ] Entering performSearch
    14:39:41,178 [ INFO ] Exiting performSearch
    14:39:41,178 [ INFO ] getAllCandidats => onFailure: 500 The call failed on the server; see server log for details
    14:39:41,178 [ WARN ] connection faileur on: performSearch
    Comme je l'ai dit le problème bloc lors de l'appel au serveur (avant dernier warn).
    Seulement une fois que j'ai rajouté le mapping entre mobility et candidate à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	
            <joined-subclass name="com.avisto.recruter.shared.model.Mobility" table="Mobility" >
    		<key column="id_entity"/>
    		<list name="candidates" lazy="false" table="CandidateMobility" inverse="true"> 
    	      		<key column="id_entity" />
    	      		<list-index column="idx"/>
    			<many-to-many class="com.avisto.recruter.shared.model.Candidate" column="id"/> 
        		</list>		
    	</joined-subclass>

    La méthode qui échoue est la méthode GWT coté client qui est sensé récupérer les données qui sont coté server. Dès lors que dans le fichier de mapping je rajoute une <list> ou un <set> dans la classe mobility, la méthode va systématiquement passer par onFailure :
    (d'où ma question est-ce qu'il y a un problème de mapping qui empêchent de rendre la classe Mobility serializable par 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
    16
    17
    18
    19
    20
    21
    22
     
    	public void loadMobilitiesFromServer() {
    		if(getOfflineMode() == false) {
    			dataService.findAllMobilities(new AsyncCallback<List<Mobility>>() {
    				@Override
    				public void onFailure(Throwable caught) {
     
    					if (LoginUtil.checkLogged(caught)) {
    						Log.info("getAllMobilities => onFailure: " + caught.getMessage());
    						ModalWindow.alert("getAllMobilities:", caught.getMessage());
    						onConnectionFailure("getAllMobilities");
    					}
    				}
    				@Override
    				public void onSuccess(List<Mobility> result) {
    					Log.info("getAllMobilities => onSuccess (" + result.size() + ")");
    					setMobilities(result);
    				}
    			});
    		} else {
    			setMobilities(dataServiceOffline.findAllMobilities());
    		}

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 38
    Points : 26
    Points
    26
    Par défaut
    Je me demande sinon, si l'erreur viendrait pas simplement du bean mobility qui suite à mes modifications ne peut plus être sérialisé (et donc ne plus être appelé par la partie cliente de GWT).
    Voici le code avec mes ajouts en gras :

    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 Mobility extends SimpleEntity {
    
    	private static final long serialVersionUID = 6077647252422394359L;
    
    	private List<Candidate> candidates = new LinkedList<Candidate>();
    	
    	public List<Candidate> getCandidates() {
    		return candidates;
    	}
    
    	public void setCandidates(List<Candidate> candidates) {
    		this.candidates = candidates;
    	}
    
    	public Mobility() {
    		super();
    	}
    
    	public Mobility(Long id, String name, List<Candidate> candidates) 
           {
    		super(id, name);
    		this.candidates = candidates;
    	}	
    }

Discussions similaires

  1. Ordonnancement de tâches dans GWT avec la classe Scheduler
    Par Mickael Baron dans le forum GWT et Vaadin
    Réponses: 0
    Dernier message: 03/04/2012, 22h37
  2. Réponses: 7
    Dernier message: 17/01/2009, 15h45
  3. Réponses: 4
    Dernier message: 15/10/2006, 18h05
  4. [Hibernate]Problème de requete avec "join fetch"
    Par gauloiskiki dans le forum Hibernate
    Réponses: 4
    Dernier message: 21/06/2006, 09h54

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