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
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
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>
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
Partager