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))
En analysant 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, et une base de donnee oracle 10g express edition.
Je vous ai joint la requete SQL incriminee, et la definition de mes differentes tables
Hibernate version:
hibernate 3.2
Mapping documents:
Code:
<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>
[b]<many-to-one column="TEAM_ID" name="team" class="Team" cascade="save-update" />[/b]
</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:
<?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" />
[b] <set name="players" inverse="true" lazy="false">
<key column="TEAM_ID" />
<one-to-many class="Player" />
</set>[/b]
<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>
Code between sessionFactory.openSession() and session.close():Full stack trace of any exception that occurs:Quote:
org.hibernate.exception.SQLGrammarException: could not initialize a collection: [sample.hibernate.model.Team.players#5]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.loadCollection(Loader.java:1926)
Caused by: java.sql.SQLException: ORA-00936: missing expression
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
Problems with Session and transaction handling?
Name and version of the database you are using:Oracle 10g express edition
The generated SQL (show_sql=true):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:Code:
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),
[b]"TEAM_ID" NUMBER(20,0),[/b]
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
) /