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 :

Heritage par sous classe avec discriminateur


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai

    Inscrit en
    Décembre 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 19
    Points : 23
    Points
    23
    Par défaut Heritage par sous classe avec discriminateur
    Salut, voila jai achete le bouquin Hibernate 3.0, et jai essaye de mettre en pratique le modele de l heritage avec l attribut discriminator et des jointures (Chaque sous type est represente par une table), mais celui ci ne fonctionne pas super

    J'ai compris d'ou venait le probleme, mais je ne sais pas comment apporter une solution viable, il ya une mauvaise generation du sql.

    Explication:


    Je rencontre un probleme lors du chargement des objets PLAYER depuis une TEAM. (une TEAM est compose de plusieurs PLAYERs 0...n (set))

    Ena anlaysant la requete SQL, celui-ci va chercher la propriete TEAM_ID dans la table PERSON, mais celle-ci n 'est presente que dans la table PLAYER.... Je n arrive pas a trouver une solution viable pour faire fonctionner l' exemple.

    Je voulais savoir si vous aviez teste a fond vos exemples fournis, jai aussi telecharge les exemples fournis depuis le site web eyrolles, mais il n y a pas d erreur.

    J'utilise la version 3.2 de hibernate avec une jdk 1.5, eclipse 3.2 et oracle 10g express edition

    Je vous ai joint mon projet eclipse, assez simple, ainsi que la requete SQL incriminee, et la definition de mes differentes tables


    mapping Person.hbm.xml

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    <hibernate-mapping package="sample.hibernate.model">
      <class name="Person" table="PERSON" lazy="true">
     
      	<id name="id" column="PERSON_ID">
      	 <generator class="native">
          	<param name="sequence">SEQ_PERSON_ID</param>
          </generator>
      	</id>
     
      	<discriminator column="PERSON_TYPE" type="string" />
     
      	<property name="name" column="PERSON_NAME"/>
      	<property name="birthday" column="BIRTHDAY"/>
      	<property name="height"	column="HEIGHT"/>
      	<property name="weight"	column="WEIGHT"/>
     
      	<subclass name="Player" discriminator-value="PLAYER" >
      		<join table="PLAYER">
      			<key column="PLAYER_ID"/>
      			<property name="playerName" column="PLAYER_NAME" />
      			<property name="number" column="PLAYER_NUMBER" />
      			<property name="hasBeenMvpCount" formula="select count(*) from GAME g where g.PLAYER_ID = PLAYER_ID"></property>
     
      			<many-to-one column="TEAM_ID" name="team" class="Team" cascade="save-update"  />
      		</join>
     
      		<subclass name="Rookie" discriminator-value="ROOKIE">
      			<join table="ROOKIE">
      				<key column="ROOKIE_ID" />
      				<property name="salary" column="SALARY" />
      			</join>
      		</subclass>
     
      		<subclass name="Superstar" discriminator-value="SUPERSTAR">
      			<join table="SUPERSTAR">
      				<key column="SUPERSTAR_ID" />
      				<property name="salary" column="SALARY" />
      				<many-to-one column="SPONSOR_ID" name="sponsor" class="Sponsor" />  				
      			</join>
      		</subclass>
     
      	</subclass>
     
    	<subclass name="Coach" discriminator-value="COACH">
    		<join table="COACH">
    			<key column="COACH_ID" />
    			<property name="coachName" column="COACH_NAME" />
    		</join>
    	</subclass>
     
     
      </class>
    </hibernate-mapping>
    mapping Team.hbm.xml

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping SYSTEM
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="sample.hibernate.model">
     
    <class name="Team" table="TEAM">
     
      <id name="id" column="TEAM_ID">
    	   <generator class="native">
          	<param name="sequence">SEQ_TEAM_ID</param>
          </generator>
      </id>
     
      <property name="name" column="TEAM_NAME"/>
      <property name="nbWon" column="NB_WON"/>
      <property name="nbLost" column="NB_LOST"/>
      <property name="nbPlayed" column="NB_PLAYED"/>
     
      <many-to-one name="coach" class="Coach" column="COACH_ID" 
        unique="true" cascade="save-update" lazy="false" />
     
      <set name="players" inverse="true" lazy="false">
        <key column="TEAM_ID" />
        <one-to-many class="Player" />
      </set>
     
      <map name="homeGames" cascade="save-update" inverse="true" lazy="false">
        <key column="HOME_TEAM_ID" />
        <index column="GAME_DATE" type="date" />
        <one-to-many class="Game" />
      </map>
     
      <map name="awayGames" cascade="save-update" inverse="true" lazy="false">
        <key column="AWAY_TEAM_ID" />
        <index column="GAME_DATE" type="date"  />
        <one-to-many class="Game" />
      </map>
     
    </class>
    </hibernate-mapping>

    SQL GENERATED BY HIBERNATE:

    select players0_.TEAM_ID as TEAM7_1_,
    players0_.PERSON_ID as PERSON1_1_,
    players0_.PERSON_ID as PERSON1_2_0_,
    players0_.PERSON_NAME as PERSON3_2_0_,
    players0_.BIRTHDAY as BIRTHDAY2_0_,
    players0_.HEIGHT as HEIGHT2_0_,
    players0_.WEIGHT as WEIGHT2_0_,
    players0_1_.PLAYER_NAME as PLAYER2_3_0_,
    players0_1_.PLAYER_NUMBER as PLAYER3_3_0_,
    players0_1_.TEAM_ID as TEAM4_3_0_,
    players0_2_.SALARY as SALARY4_0_,
    players0_3_.SALARY as SALARY5_0_,
    players0_3_.SPONSOR_ID as SPONSOR3_5_0_,
    select count(*) from GAME g where g.PLAYER_ID = players0_1_.PLAYER_ID as formula0_0_,
    players0_.PERSON_TYPE as PERSON2_2_0_

    from PERSON players0_

    inner join PLAYER players0_1_ on players0_.PERSON_ID=players0_1_.PLAYER_ID
    left outer join ROOKIE players0_2_ on players0_.PERSON_ID=players0_2_.ROOKIE_ID
    left outer join SUPERSTAR players0_3_ on players0_.PERSON_ID=players0_3_.SUPERSTAR_ID

    where players0_.TEAM_ID = 2



    DEFINITION DES TABLES:

    CREATE TABLE "PERSON"
    ( "PERSON_ID" NUMBER(20,0),
    "PERSON_TYPE" VARCHAR2(255) NOT NULL ENABLE,
    "PERSON_NAME" VARCHAR2(255),
    "BIRTHDAY" DATE,
    "HEIGHT" FLOAT(126),
    "WEIGHT" FLOAT(126),
    CONSTRAINT "PERSON_ID_PK" PRIMARY KEY ("PERSON_ID") ENABLE
    ) /

    la table player utilise le meme id que la table PERSON !!!

    CREATE TABLE "PLAYER" (
    "PLAYER_ID" NUMBER(20,0),
    "PLAYER_NAME" VARCHAR2(255),
    "PLAYER_NUMBER" NUMBER(10,0),
    "TEAM_ID" NUMBER(20,0),
    CONSTRAINT "PLAYER_ID_PK" PRIMARY KEY ("PLAYER_ID") ENABLE,
    CONSTRAINT "PLAYER_ID_NOT_NULL" CHECK ( "PLAYER_ID" IS NOT NULL) ENABLE,
    CONSTRAINT "FK_PLAYER_TEAM" FOREIGN KEY ("TEAM_ID") REFERENCES "TEAM" ("TEAM_ID") ENABLE,
    CONSTRAINT "FK_PLAYER_PERSON" FOREIGN KEY ("PLAYER_ID") REFERENCES "PERSON" ("PERSON_ID") ENABLE
    ) /

    CREATE TABLE "TEAM" (
    "TEAM_ID" NUMBER(20,0),
    "COACH_ID" NUMBER(10,0),
    "TEAM_NAME" VARCHAR2(30),
    "NB_WON" NUMBER(10,0),
    "NB_LOST" NUMBER(10,0),
    "NB_PLAYED" NUMBER(10,0),
    CONSTRAINT "TEAM_ID_PK" PRIMARY KEY ("TEAM_ID") ENABLE
    ) /

    Merci pour laide que vous pourrez m apporter
    Fichiers attachés Fichiers attachés
    Petit a Petit on devient moins Petit

  2. #2
    Membre à l'essai

    Inscrit en
    Décembre 2002
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 19
    Points : 23
    Points
    23
    Par défaut
    Apres une longue recherche

    Il est obligatoire de definir TEAM_ID au niveau de la table PERSON et non de la table PLAYER (il faudrait faire de meme pour le SPONSOR_ID defini dans la table SUPERSTAR), c'est une limitation de hibernate !

    Il est possible de realiser ceci en faisant une strategie par sous classe en voici le mapping (on utilise plus le discriminator):

    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
    34
    35
    36
    37
    38
    39
    40
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping SYSTEM
    			"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="cours4.model">
    	<class name="Person" table="PERSON" abstract="true">
     
    		<id name="id" column="PERSON_ID">
    			<generator class="native">
    		      	<param name="sequence">SEQ_PERSON_ID</param>
    			</generator>
    		</id>
     
    		<property name="name" column="PERSON_NAME"/>
    		<property name="birthday" column="BIRTHDAY"/>
    		<property name="height" column="HEIGHT"/>
    		<property name="weight" column="WEIGHT"/>
     
    		<joined-subclass name="Player" table="PLAYER">
    			<key column=" PLAYER_ID"/>
    			<property name="number" column="PLAYER_NUMBER"/>
    			<many-to-one name="team" class="Team" column="TEAM_ID"/>
     
    			<joined-subclass name="Rookie" table="ROOKIE">
    				<key column="ROOKIE_ID"/>
    			</joined-subclass>
     
    			<joined-subclass name="SuperStar" table="SUPERSTAR">
    				<key column="SUPERSTAR_ID"/>
    				<many-to-one name="sponsor" class="Sponsor" column="SPONSOR_ID" />
    			</joined-subclass>
    		</joined-subclass>
     
    		<joined-subclass name="Coach" table="COACH">
    			<key column="COACH_ID"/>
    			<many-to-one name="team" class="Team" column="TEAM_ID" />
    		</joined-subclass>
     
    	</class>
    </hibernate-mapping>
    voila je remercie antony patricio pour ses explications.
    Petit a Petit on devient moins Petit

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passer par un proxy avec mdp avec la classe URL :(
    Par lex13 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 31/07/2007, 17h42
  2. Problème avec une sous classe de Graphics2D
    Par Virgile le chat dans le forum 2D
    Réponses: 1
    Dernier message: 16/06/2007, 02h59
  3. Réponses: 10
    Dernier message: 10/12/2006, 16h26
  4. un cas avec des Sous Classes
    Par Daeron dans le forum Langage
    Réponses: 7
    Dernier message: 17/01/2006, 17h39
  5. Heritage de classe avec classes internes
    Par Regis.C dans le forum Langage
    Réponses: 11
    Dernier message: 27/04/2005, 12h19

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