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 :

problème de mapping ?


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Par défaut problème de mapping ?
    Bonjour,

    Je suis nouveau dans l'utilisation d'hibernate. Je viens de réaliser une application qui fonctionne, seulement j'ai dû à plusieurs reprise contourner des problèmes sans vraiment comprendre pourquoi ça ne fonctionnait pas.
    Je pense que c'est un problème de mapping puisque j'ai également des problèmes pour les jointures.

    J'ai trois tables : Profil(id, intitulé), Autorisation(id_profil, id_fonction, perm_read, perm_update), Fonctionnalité(id, intitulé)
    Autorisation est donc une association possédant des attributs de type booléen.
    Le fait que l'association ait des attributs m'a poussé à utiliser le mapping suivant :
    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
    <class name="habilitation.Profil" table="profils">
    		<id name="id" column="id_profil">
    			<generator class="native" />
    		</id>
    		<property name="intitule" column="intitule_profil" />
    		<set name="autorisations" table="autorisation" lazy="true">
    			<key column="id_profil" />
    			<composite-element class="habilitation.Autorisation">
    				<property name="read" column="perm_read" />
    				<property name="create" column="perm_create" />
    				<property name="delete" column="perm_delete" />
    				<property name="update" column="perm_update" />
    				<many-to-one name="fonction" column="id_fonction" class="habilitation.Fonction" />
    			</composite-element>
    		</set>
    	</class>
     
    	<class name="habilitation.Autorisation" table="autorisation">
    		<composite-id>
    			<key-many-to-one name="profil" class="habilitation.Profil"
    				column="id_profil" lazy="false" />
    			<key-many-to-one name="fonction"
    				class="habilitation.Fonction" column="id_fonction" lazy="false" />
    		</composite-id>
     
    		<property name="read" column="perm_read" />
    		<property name="create" column="perm_create" />
    		<property name="delete" column="perm_delete" />
    		<property name="update" column="perm_update" />
    	</class>
     
    	<class name="habilitation.Fonction" table="fonction">
    		<id name="id" column="id_fonction">
    			<generator class="increment" />
    		</id>
    		<property name="intitule" column="intitule_fonction" />
    		<set name="autorisations" table="autorisation" lazy="false">
    			<key column="id_fonction" />
    			<one-to-many class="habilitation.Autorisation" />
    		</set>
    	</class>
    Le "composite-element" dans Profil me permet de gérer parfaitement le fait que l'association ai des attributs etc. Je n'ai pas utilisé ce tag dans Fonction car je n'en ai pas l'utilité et donc ne pense pas que ce soit nécessaire.

    Voici donc mes trois classes :
    Code java : 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 class Profil {
     
    	private int id;
    	private String infos_habilitation;
    	private Set autorisations;
    	...
    }
    public class Autorisation implements Serializable {
    	private Fonction fonction;
    	private Profil profil;
    	private boolean create;
    	private boolean read;
    	private boolean update;
    	private boolean delete;
    ...
    }
    public class Fonction {
    	private int id;
    	private String intitule;
    	private Set autorisations;
    ...
    }

    Ce que je ne comprends pas, c'est pourquoi le code suivant ne fonctionne pas :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monProfil.getAutorisations().remove(monAutorisation)
    session.save(monProfil)
    Ce code ne me donne aucun message d'erreur mais n'enlève pas non plus l'autorisation de ce profil.
    J'ai contourné le problème en passant par un
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    session.delete(autorisation);
    session.flush();
    Mais j'aimerais comprendre pourquoi la première ne fonctionne pas.

    Bien qu'aillant lu des tutoriels par dizaines ces deux dernières semaines ce genre de phénomène est encore pour moi assez flou.

    Merci pour vos lenternes.

    N'hésitez pas à me demander toute autre information utile.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Salut,
    Le problème vient du fait que tu traites les objets "Autorisation" comme des entités à part entière et aussi comme des éléments composite. En les déclarant en composite-element dans le mapping de la classe Profil, cela veut dire que la vie d'un objet Autorisation dépend entièrement de celle de l'objet Profil le contenant. Hibernate applique les cascade delete de manière implicite, sans que tu ais besoin de le déclarer en ce qui concerne les composite-element. Et donc, dans ce cas, Autorisation ne plus être référencé par une autre classe, sinon ça causerait des problèmes d'intégrité référencielle en cas de suppression. Or dans ton cas, je vois qu'il y a également une relation one-to-many de Fonction à Autorisation, ce qui pose problème effectivement.
    Tu dois donc faire un choix de conception parmi deux possibilités (ou d'autres certainement...) :
    -- Soit Autorisation est une entité à part entière, avec son propre mapping dans un élément <class>, et les autres classes en font référence par des éléments <many-to-one>, <one-to-many> ... de manière ordinaire.
    -- Soit Autorisation est déclaré comme <composite-element> dans la classe Profil, et auquel cas tu n'as plus à lui définir un élément <class> séparé et il ne doit pas être référencé par Fonction. Bien évidement Autorisation peut très bien avoir une référence <many-to-one> avec Fonction.
    Voilà un peu ce que je peux dire pour contribuer à éclairer le sujet. En définitive la décision te revient parce que tout dépend des besoins propres à ton application. Mais en règle générale, quand un élément est référencé par deux ou plusieurs autres, il n'est pas un bon candidat pour le <composite-element>.

  3. #3
    Membre Expert
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Par défaut
    Merci beaucoup pour toutes ces informations. Je vais re-écrire le projet avec une base plus saine.

    Je vais repartir sur ce mapping là, où j'ai essentiellement enlevé le "composite-element" dans Profil que j'ai remplacé par un simple Set :
    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
    	<class name="habilitation.Fonction" table="fonction">
    		<id name="id" column="id_fonction">
    			<generator class="increment" />
    		</id>
    		<property name="intitule" column="intitule_fonction" />
    		<set name="autorisations" table="autorisation" lazy="false">
    			<key column="id_fonction" />
    			<one-to-many class="habilitation.Autorisation" />
    		</set>
    	</class>
     
    	<class name="habilitation.Profil" table="profils">
    		<id name="id" column="id_profil">
    			<generator class="native" />
    		</id>
    		<property name="intitule" column="intitule_profil" />
    		<set name="autorisations" table="autorisation" lazy="false">
    			<key column="id_profil" />
    			<one-to-many class="habilitation.Autorisation" />
    		</set>
    	</class>
     
    	<class name="habilitation.Autorisation" table="autorisation">
    		<composite-id>
    			<key-many-to-one name="profil" class="habilitation.Profil"
    				column="id_profil" lazy="false" />
    			<key-many-to-one name="fonction"
    				class="habilitation.Fonction" column="id_fonction" lazy="false" />
    		</composite-id>
    		<property name="read" column="perm_read" />
    		<property name="create" column="perm_create" />
    		<property name="delete" column="perm_delete" />
    		<property name="update" column="perm_update" />
    	</class>

    Je garde les trois mêmes classes que précédement.
    J'ai essayé de respecter ce que tu as dit :
    -- Soit Autorisation est une entité à part entière, avec son propre mapping dans un élément <class>, et les autres classes en font référence par des éléments <many-to-one>, <one-to-many> ... de manière ordinaire.
    En tout cas merci beaucoup pour ton intervention, il y a beaucoup de choses que je comprends mieux.

Discussions similaires

  1. [IBATIS/mysql] problème de mapping
    Par iftolotfi dans le forum Persistance des données
    Réponses: 3
    Dernier message: 07/07/2006, 10h40
  2. [Débutant] Problème de mapping des ports
    Par zehle dans le forum VHDL
    Réponses: 1
    Dernier message: 22/05/2006, 22h37
  3. [PERL] Problème avec map
    Par LE NEINDRE dans le forum Langage
    Réponses: 9
    Dernier message: 05/10/2005, 09h48
  4. [CASTOR]Problème de mapping de données
    Par chuck norris dans le forum Persistance des données
    Réponses: 1
    Dernier message: 13/07/2005, 22h01
  5. [Struts] Problème de mapping
    Par ArseNic dans le forum Struts 1
    Réponses: 5
    Dernier message: 10/02/2005, 10h11

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