-->
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: Comment mapper une collection de collection [Resolu]
PostPosted: Thu Sep 25, 2008 12:44 pm 
Newbie

Joined: Mon Jun 16, 2008 8:53 am
Posts: 6
Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp

Hibernate version:3.0

Name and version of the database you are using:Mysql 5

Bonjour,

je cherche à mapper une collection qui possede des elements ayant eux meme leur propre collection.

Concretement:
------------
| TABLE A |
------------
1|
|
*|
-------------
| TABLE B |
-------------
1|
|
*|
-------------
| TABLE C |
-------------


Code:
<?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>
  <class name="classeA" table="TABLE_A">
    <composite-id name="id"      class=""
         <key-property name="id1ClasseA" type="java.lang.String">
           <column name="ID_1_CLASSE_A" scale="50" precision="0" not-null="true" sql-         type="varchar" />
      </key-property>
      <key-property name="ID_2_CLASSE_A" type="java.lang.String">
         <column name="ID_2" scale="50" precision="0" not-null="true" sql-type="varchar" />
      </key-property>
    </composite-id>

    <property name="" type="java.lang.String">
      <column name="" scale="10" precision="0" not-null="true" sql-type="varchar" />
    </property>
     
           .
           .
           .
     
   
<set name="bb" table="TABLE_B" cascade="all" >
    <key>
      <column name="ID_1_CLASSE_A" not-null="true" />
      <column name="ID_2_CLASSE_A" not-null="true" />
    </key>
    <one-to-many class="ClasseB" />
</set>
</class>

<class name="com.eurecia.backoffice.ImputationStructureItem" table="TABLE_B">
    <composite-id name="id" class="ClasseB">
      <key-property name="id1ClasseB" type="java.lang.String">
        <column name="ID_1_CLASSE_B" scale="50" precision="0" not-null="true" sql-type="varchar" />
      </key-property>
      <key-property name="id2ClasseB" type="java.lang.String">
         <column name="ID_2_CLASSE_B" scale="50" precision="0" not-null="true" sql-type="varchar" />
   <key-property name="id3ClasseB" type="java.lang.String">
         <column name="ID_3_CLASSE_B" scale="50" precision="0" not-null="true" sql-type="varchar" />

      </key-property>
   </composite-id>
   
<!--  tous les property --> 
        
<set name="cc" table="TABLE_C" cascade="all" lazy="false">
    <key>
       <column name="ID_1_CLASSE_B" not-null="true"/>
       <column name="ID_2_CLASSE_B not-null="true"/>
       <column name="ID_3_CLASSE_B not-null="true"/>
   </key>
          
    <composite-element class="ClasseC">
       <!--  tous les property -->         
    </composite-element>
</set>
   
   </class>

</hibernate-mapping>






voilà, en espérant que j'ai eté assez explicite:
Ce mapping vous semble t-il correctement écrit?
Auriez vous des suggestions à me faire?

@ tres bientot, merci pour vos réponses.


Last edited by spirit on Wed Oct 01, 2008 11:11 am, edited 1 time in total.

Top
 Profile  
 
 Post subject: Plus simplement
PostPosted: Tue Sep 30, 2008 8:35 am 
Newbie

Joined: Mon Jun 16, 2008 8:53 am
Posts: 6
Je vois que mon post inspire plus d'un.

Je reformule plus simplement ma demande.Je souhaiterais mapper une collection d'une collection. Je prends l'exemple qui suit:

Soient les tables relationnelles suivantes:

parent [ id_parent, nom, prenom]
enfant [id_parent, id_enfant, nom, prénom]
adresse [id_parent, id_enfant, pays, rue]

et les relations entre les différentes tables:
parent 1 <-----> * enfant 1 <-----> * adresse (écritute UML )

J'ai écris un fichier de mapping ressemblant à celui du 1er post.

Code:
<hibernate-mapping>
    <class name="Parent"  table="PARENT">
        <id name = "id_parent">
        <!-- Définition de quelques property!-->
       <set name="enfants" table="ENFANT" inverse="true">
            <key column name="id_parent"/>
            <one-to-many class="Enfants"/>
        </set>
    </class>

    <class name="Enfants" table="ENFANT">
        <id name="id_enfant">
       <!-- Définition de quelques property!-->
       <set name="adresses" table="ADDRESS">
            <key>
               <column name="id_enfant"/>
                <column name="id_address"/>
           </key>
        <!-- Définition de quelques property!-->
        </set>

    < /class>
</hibernate-maping>



tout fonctionne comme prévu (UPDATE, INSERT) à l'exception du DELETE sur les items "enfant" qui ne marche pas.

N'hesitez pas à me poser des questions si je n'ai pas eté clair.

Merci à tous pour vos réponses.

Notes: Hibernate 3.0
MySQL 5.0
JBoss 4.1
Eclipse sous windows xp (au cas où)


Top
 Profile  
 
 Post subject: mapping de collections de collection [résolu]
PostPosted: Wed Oct 01, 2008 11:08 am 
Newbie

Joined: Mon Jun 16, 2008 8:53 am
Posts: 6
Nouveau fichier de mapping (les nouveautés sont en rouge)

<hibernate-mapping>
<class name="Parent" table="PARENT">
<id name = "id_parent">
<!-- Définition de quelques property!-->
<set name="enfants" table="ENFANT" inverse="true" cascade="all-delete-orphan">
<key column name="id_parent"/>
<one-to-many class="Enfants"/>
</set>
</class>

<class name="Enfants" table="ENFANT">
<id name="id_enfant">
<many-to-one name="pere" class="Parent">
<!-- Définition de quelques property!-->
<set name="adresses" table="ADDRESS">
<key>
<column name="id_enfant"/>
<column name="id_address"/>
</key>
<!-- Définition de quelques property!-->
</set>

< /class>
</hibernate-maping>



Apres 3 jours de galère j'ai enfin la solution (God bless me):

Il faut comprendre qu'à travers ce mapping les élements "Enfants" sont considérés au sens hibernate comme des entity (à cause du mot clé <class>), c'est à dire qu'ils ne sont pas directement liés aux parents.

Note: un enfant ne peut pas vraiment exister sans son père. Si nous effacons un enfant de la collection, nous voulons vraiment qu'il soit effacé. Pour cela, nous devons utiliser cascade="all-delete-orphan".

Tout semble fonctionner correctement (création, modification sur un enfant) à l'exception de la suppression d'un enfant qui n'est pas pris en compte.
Cela est tout à fait normal puisque les élements enfants n'ont aucun lien avec leur père. Ce sont des objets au sens hibernate, donc possèdant leur propre cycle de vie.


Ainsi la solution de suppression est la suivante:
//** Début code java

//Suppression de l'objet enfant dans parent
parent.getEnfants().remove(enfant);
//Enfant ne possède plus de père
enfant.setParent(null);
//Suppression de l'entity dans la session
session.delete(enfant);
//Commit
session.flush();

//** Fin code java


N'hesitez pas à me contacter si vous avez besoin d'aide ou si comme moi vous butez sur ce problème; je ne suis pas un pro d'hibernate mais j'essaierais de faire mon mieux pour vous aider.


Solidaire dans la galère.... (à méditer)


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.