-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: HashMap et 4 tables en jeu, comment présenter le .hbm ??
PostPosted: Mon Oct 03, 2005 9:24 am 
Senior
Senior

Joined: Tue May 10, 2005 9:00 am
Posts: 125
Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp

Hibernate version: 3.0.1

Bonjour, j'ai un mapping db / classes que j'ai un peu de mal à appréhender.

J'ai 4 tables. A partir de ces 4 tables, il me faut obtenir une classe contenant un HashMap donc les clés sont des string et les valeur une deuxième classe.
L'ennui c'est que les clés de la hashmap sont dans une table et que les valeur de la hashmap sont dans une autre. Une table intermédiaire se charge de faire le lien entre les deux en utilisant une informations contenue dans la classe owner de la HashMap. Bref, a partir de 4 tables, je dois obtenir un mapping deux classes!


Voici en résumé mes table

EMPLOYEE (INTEGER EMPL_ID,...) -> classe employee

USER_FUNCTION (INTEGER FCT_ID,...) -> classe function

USER_FCT_GROUP(INTEGER FCT_GROUP_ID, STRING KEY)

USER_FCT_GROUP_LINK
(INTEGER LINK_ID,
INTEGER FCT_GROUP_ID
INTEGER EMPL_ID
INTEGER FCT_ID);


pour avoir la liste (key -> id de l'object à mettre en valeur) en sql pur, j'ai:

select USER_FCT_GROUP.FCT_GROUP_KEY, USER_FCT_GROUP_LINK.FCT_ID
from USER_FCT_GROUP, USER_FCT_GROUP_LINK
where USER_FCT_GROUP_LINK.empl_id=%EMPLOYEE_ID% AND USER_FCT_GROUP.FCT_GROUP_ID=USER_FCT_GROUP_LINK.FCT_GROUP_ID;
avec EMPLOYEE_ID étant l'id de la classe employee contenant la hashmap.

Autrement dit, je prend les clés dans USER_FCT_GROUP, les valeur sont obtenue en joignant avec USER_FCT_GROUP_LINK, utilisant l'id de l'employée dans la clause where, çà parmet d'obtenir un FCT_ID qui doit ensuite être transformé en un object USER_FUCTION


A l'arrivée, il faudrait que je puisse faire

Function f = (Function)someEmployee.getFunctionMap().get('SomeFunctionKey');

Malheureusement, tous les examples que j'ai vu avec des Map et Hibernate supposent que la clé et la valeur sont dans une même table.

Quelqu'un a une idée???
Ou des pointeurs sur de la doc qui pourraient m'aider?

Merci.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 12, 2005 3:20 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Juste une suggestion : pourquoi ne fais tu pas un design plus "objet" en n'utilisant pas une map mais bien quatre classes et avec une méthode "someEmployee.getFunctionByKey("someFunctionKey")" ?

_________________
Seb
(Please don't forget to give credits if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Oct 13, 2005 5:28 am 
Senior
Senior

Joined: Tue May 10, 2005 9:00 am
Posts: 125
Merci de la suggestion, mais si j'avais pu faire aussi simple çà aurait déjà été fait. Je ne peux pas parce que j'ai besoin d'exporter çà sous forme d'une collection à clé-valeur. Je n'ai pas nécessairement toujours besoin 'la fonction X pour l'employé Y' mais plutot souvent de 'la liste des fonctions pour l'employé Y avec leur clé'

Par exemple, pour l'afficher dans un formulaire struts.

De plus, la suggestion ne fait que reporter le problème.

someEmployee.getFunctionByKey("someFunctionKey")"

fera un truc genre return someMap.get("someFunctionKey");

pire, dans ton exemple qu'est censé faire
Code:
someEmployee.setFunctionByKey("someFunctionKey", someFunction)

Dans le cas d'une map, c'est simple et Hibernate gere la persistence comme un grand!


Pour le moment je me suis débrouillé avec le code suivant:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="be.rmi.intranet.db.users" default-lazy="true">
<class name="be.rmi.intranet.db.users.User" table="HR_EMPLOYEE" lazy="false">
<cache usage="read-only"/>
  <id name="empl_id">
   <column name="empl_id" not-null="true" unique="true" sql-type="NUMBER"/>
   <generator class="select">
      <param name="key">empl_id</param>
   </generator>
  </id>
   <property name="firstname" column="EMPL_FIRSTNAME" type="string" not-null="true"/>
   <property name="lastname" column="EMPL_LASTNAME" type="string" not-null="true"/>
   <property name="title" column="TITLE" type="string" not-null="true"/>
   <property name="email" column="EMPL_EMAIL" type="string"/>
   <property name="department" column="DEPT_NAME" type="string"/>
   <property name="section" column="SECT_NAME" type="string"/>
   <many-to-one name="timeKeeper" column="time_keeper_id"/>
   <map name="privateManagers" table="USER_FCT_GROUP_LINK">
       <key column="EMPL_ID"/>
       <map-key formula="(select grp.FCT_GROUP_KEY from USER_FCT_GROUP grp where grp.FCT_GROUP_ID=FCT_GROUP_ID)" type="string"/>
       <many-to-many column="FCT_ID" class="be.rmi.intranet.db.users.Function" />
   </map>
</class>
</hibernate-mapping>



Code:
/*
* Created on May 3, 2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package be.rmi.intranet.db.users;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
* @author delbd
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class User {

    private long empl_id;
    private String firstname;
    private String lastname;
    private String title;
    private String email;
    private String department;
    private String section;
    private TimeKeeper timeKeeper;
    private Map privateManagers;
    private Map exportedManagers;
    private Map functionGroups=new HashMap();
    ....... retiré les getters/setters pas importants ici ......
    public Map getManagers() {
        return exportedManagers;
    }   
    /**
     * Used only by hibernate
     */       
    private Map getPrivateManagers() {
        return privateManagers;
    }
    private void setPrivateManagers(Map privateManagers) {
        this.privateManagers = privateManagers;
        exportedManagers = Collections.unmodifiableMap(privateManagers);
    }
}



Malheureusement, çà ne supporte pas l'insertion dans la map de par l'utilisation de 'formula' :/ (raison d'ailleurs pour laquelle j'ai des getters/setters privé utilisé par hibernate et que getManagers() retourne une version non modifiable de la map.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.