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 :

Mapping un peu particulier


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut Mapping un peu particulier
    Bonjour à tous,

    Alors voilà mon problème c'est que je n'ai aucune idée de comment mapper mes mes classes (j'entends par là, je ne sais pas quelle relation utiliser où : one-to-many ? many-to-many ?).

    Je souhaite réaliser une application J2EE simple qui permet de prévoir un plan de charge.
    Pour cela, j'ai 3 choses :
    - Des ressources
    - Des applications
    - Des charges

    Mon modèle relationnel :

    RESSOURCE :
    - ID
    - NOM
    - PRENOM

    APPLICATION :
    - ID_APPLI
    - LIBELLE

    PLAN_CHARGE :
    # ID_RESSOURCE
    # ID_APPLICATION
    # DATE_CHARGE
    - CHARGE

    En parallèle à cela, j'ai 3 classes qui correspondent à ces tables : Ressource, Application et Charge.

    Comment, selon vous devrais-je mapper ces 3 classes entre elles ?

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Citation Envoyé par Dark_TeToN Voir le message

    PLAN_CHARGE :
    # ID_RESSOURCE
    # ID_APPLICATION
    # DATE_CHARGE
    - CHARGE

    En parallèle à cela, j'ai 3 classes qui correspondent à ces tables : Ressource, Application et Charge.

    Comment, selon vous devrais-je mapper ces 3 classes entre elles ?
    Bonjour,
    La clé primaire de la table PLAN_CHARGE est une clé composée de ID_RESSOURCE et ID_APPLICATION c'est ça? ou cette clé inclut aussi la DATE_CHARGE?

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Cette clef inclut aussi DATE_CHARGE. D'ailleurs autant pour moi j'ai fait une légère erreur :

    PLAN_CHARGE :
    # ID_RESSOURCE
    # ID_APPLICATION
    - DATE_CHARGE
    - CHARGE

    DATE_CHARGE n'est pas une clef étrangère comme aurait pu l'indiquer mon post. Mais la clef primaire est bien composée des trois colonnes suivantes :
    - ID_RESSOURCE
    - ID_APPLICATION
    - DATE_CHARGE

    Puisque pour UNE ressource, UNE APPLICATION à UNE DATE il n'y a qu'une seule charge possible ! Pour UNE ressource et UNE application, plusieurs dates sont possibles !

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Eh bien tu vas créer un EmbeddedId pour l'entité PlanCharge, comme indiqué dans cet exemple ici

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Pour mon mapping, je m'attendais plutôt à un fichier hbm... Normalement Hibernate embarque JPA si je ne m'abuse mais les annotations ne sont pas reconnues ! J'aurai préféré un fichier Charge.hbm.xml dans la mesure du possible...

    Je vais essayer pendant ce temps là de faire fonctionner les annotations...

    EDIT : Je ne peux même pas DL la librairie, j'avais du récupérer le .jar sur quelqu'un, mais l'accès à tous les DL est bloqué...

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Citation Envoyé par Dark_TeToN Voir le message
    Pour mon mapping, je m'attendais plutôt à un fichier hbm... Normalement Hibernate embarque JPA si je ne m'abuse mais les annotations ne sont pas reconnues ! J'aurai préféré un fichier Charge.hbm.xml dans la mesure du possible...
    Si tu pars d'un existant qui t'impose les hbm plutot que les annotations,tu t'alignes.
    Citation Envoyé par Dark_TeToN Voir le message
    EDIT : Je ne peux même pas DL la librairie, j'avais du récupérer le .jar sur quelqu'un, mais l'accès à tous les DL est bloqué...
    J'ai pas compris...
    Mais personnellement je suis plutot annotations que fichiers, ça réduit déjà la taille du projet, et bien d'autres raisons...

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Citation Envoyé par DarkTeToN
    EDIT : Je ne peux même pas DL la librairie, j'avais du récupérer le .jar sur quelqu'un, mais l'accès à tous les DL est bloqué...
    Je suis sur un réseau d'entreprise, je n'ai pas accès à tous les sites web...

    Citation Envoyé par DevServlet
    Si tu pars d'un existant qui t'impose les hbm plutot que les annotations,tu t'alignes.
    Oui je pars d'un existant, c'est pour ça ! Je pensais ajouter les annotations juste pour cette classe là... Mais l'utilisation de fichiers hbm serait conforme avec l'existant en effet !

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    Alors, j'avance un peu... Mais je me retrouve bloqué

    Voici mes classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Application {
     
    	private Integer id;
    	private String libelle;
    	private Boolean activite;
    	private Set<Ressource> ressources;
    	private Set<Charge> chargesAppli;
     
    	public Application() {
     
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Ressource {
     
    	private Integer id;
    	private String nom;
    	private String prenom;
    	private Set<Application> applications;
    	private Set<Charge> chargesRessource;
     
    	public Ressource() {
     
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Charge implements Serializable {
     
    	private static final long serialVersionUID = 1L;
    	private Integer idRessource;
    	private Integer idAppli;
    	private Date dateCharge;
    	private Float charge;
     
     
    	public Charge() {
     
    	}
    }
    Bien entendu, toutes les properties ont les getters/setters associés. Voici mes fichiers 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?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 package="com.ressource">
        <class name="Ressource" table="RESSOURCE">
     
            <id name="id" type="java.lang.Integer">
                <column name="ID" length="9" not-null="true"/>
            </id>
     
            <property name="nom" type="string">
                <column name="NOM" length="50" not-null="true"/>
            </property>
     
            <property name="prenom" type="string">
                <column name="PRENOM" length="50" not-null="true"/>
            </property>
     
            <set name="applications" table="APPLI_RESSOURCE" lazy="false">
          		<key column="ID_RESSOURCE"/>
          		<many-to-many class="com.application.Application" column="ID_APPLI" outer-join="true"/>
        	</set>
     
        	<set name="chargesRessource" table="PLAN_CHARGE" lazy="false">
        		<key>
        			<column name="ID_RESSOURCE" />
        		</key>
        		<one-to-many class="com.charge.Charge" />
        	</set>
     
    	</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
    <?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 package="com.charge">
        <class name="Charge" table="PLAN_CHARGE">
     
    	    <composite-id>
    	        <key-property name="idRessource" column="ID_RESSOURCE" type="java.lang.Integer" />
    	        <key-property name="idAppli" column="ID_APPLI" type="java.lang.Integer" />
    	        <key-property name="dateCharge" column="DATE_CHARGE" type="java.util.Date" />
    	    </composite-id>
     
            <property name="charge" type="java.lang.Float">
                <column name="CHARGE" not-null="true"/>
            </property>
     
    	</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
    <?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 package="com.application">
        <class name="Application" table="APPLICATION">
     
            <id name="id" type="java.lang.Integer">
                <column name="ID_APPLI" length="9" not-null="true"/>
            </id>
     
            <property name="libelle" type="string">
                <column name="LIBELLE" length="45" not-null="true"/>
            </property>
     
            <property name="activite" type="java.lang.Boolean">
                <column name="ACTIVITE" not-null="true"/>
            </property>
     
            <set name="ressources" table="APPLI_RESSOURCE" lazy="false">
          		<key column="ID_APPLI"/>
          		<many-to-many class="com.ressource.Ressource" column="ID_RESSOURCE"/>
        	</set>
     
        	<set name="chargesAppli" table="PLAN_CHARGE" lazy="false">
          		<key column="ID_APPLI"/>
          		<one-to-many class="com.charge.Charge"/>
        	</set>
    	</class>
    </hibernate-mapping>
    Alors mon problème, qui est je pense soit un problème "d'architecture", soit un problème sur mes requêtes Hibernate, est que je souhaite charger des objets Ressource dans lesquels se trouvera la liste des Applications auxquelles la Ressource est affectée, et dans chaque Application, je souhaite qu'il y ait la liste des Charge contenues dans cette Application et pour la Ressource dans laquelle est inclue l'Application.

    Je souhaite une notion d'héritage en fait !!!

    * Ressource1
    + Appli1
    - Charge1
    - Charge2
    + Appli2
    - Charge1
    - Charge2
    * Ressource2
    + Appli1
    - Charge1
    - Charge2
    + Appli2
    - Charge1
    - Charge2

    J'aimerai que mes objets soient ainsi chargés... Est-ce au moins faisable sans repasser par un traitement Java derrière ?

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    D'après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    * Ressource1
     
        + Appli1
     
            - Charge1
     
            - Charge2
     
        + Appli2
     
            - Charge1
     
            - Charge2
    Pour une ressource donc tu as besoin de connaitre toutes les applications qui lui sont affectées. Est ce que une application bien identifiée t'auras besoin de connaitre fonctionnellement toutes les ressources auxquelles elle est allouée? Sinon je vois un simple OneToMany de Ressource Vers Application. Et coté physique j'espère qu'il y'a une foreign key de l'application dans la table Ressource? Et une charge est définie pour une application bien précise. Pour moi la date n'a pas besoin d'être dans la clé de la table PlanCharge. A moins que je n'aie pas tout capté fonctionnellement.

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Par défaut
    La charge est quotidienne en faite, d'où l'importance de la date ! C'est comme un plan de charge journalier sur 2 mois glissants.

    Pour l'instant j'ai avancé, j'ai pas mal réussi, il me reste un petit souci à régler venant de mes HashMap, mais en fait j'ai chargé mes données telles quelles, et j'ai fait le traitement en Java. Comme j'utilise des HashMap, c'est très rapide.

    Je pense que ce que je souhaitais faire est réalisable en Hibernate mais très compliqué. En ce qui concerne les applications, il est possible que je doive connaître toutes les charges ou toutes les ressources qui lui sont associées.

    Sinon pour faire la jointure entre l'application et la ressource, j'ai été obligé d'utiliser une table de jointure car une application peut se voir affecter plusieurs ressources, et une ressource peut travailler sur plusieurs applications.

    Merci en tous cas de ton aide DevServlet mais je pense que désormais le problème ne viens plus d'Hibernate ! Je souhaitais que mes données soient chargées directement bien comme il faut mais parfois je pense qu'il faut faire un choix, et j'ai choisi de faire ce chargement de données en Java plutôt que directement avec Hibernate. Je ne sais pas si c'est mieux, mais ce n'est pas lent du tout pour l'instant et puis normalement l'application n'est pas amenée à évoluer beaucoup puisqu'elle reste utilisée pour des "petites" équipes (20aine de personnes maximum).

    Merci encore !

  11. #11
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Citation Envoyé par Dark_TeToN Voir le message
    La charge est quotidienne en faite, d'où l'importance de la date ! C'est comme un plan de charge journalier sur 2 mois glissants.
    Merci encore !
    Tu veux par là dire que tu peux avoir plusieurs plan de charges dans la même journée c'est ça? Car une date en TIMESTAMP aurait bien fait l'affaire non?

Discussions similaires

  1. [XSLT]Tableau un peu particulier
    Par JohnBlatt dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/06/2006, 19h14
  2. Un tri un peu particulier
    Par GregPeck dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/06/2006, 16h32
  3. Menu un peu particulier avec des onmouseover
    Par Jinroh77 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/02/2006, 15h30
  4. #define un peu particulier
    Par greuh dans le forum C
    Réponses: 14
    Dernier message: 12/10/2005, 17h42
  5. Réponses: 2
    Dernier message: 05/01/2004, 12h23

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