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: Heritage par sous classe avec discriminateur
PostPosted: Wed Jan 03, 2007 5:08 pm 
Newbie

Joined: Wed Jan 03, 2007 5:03 pm
Posts: 4
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
) /


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 04, 2007 2:50 pm 
Newbie

Joined: Wed Jan 03, 2007 5:03 pm
Posts: 4
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):

Quote:
<?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.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Feb 19, 2007 5:53 pm 
Newbie

Joined: Mon Aug 07, 2006 4:57 pm
Posts: 4
Salut regisdev,
moi aussi j'ai un probleme lors de la récupération des objets. Je m'explique.

J'ai une une interface qui s'appelle ProviderInfo. De cette dernière, elles dérivent deux classes qui sont : AdAccount et YaAccount.
J'ai utilisé la stratégie <<une table par sous-classe avec discriminateur>>. Disant que ça se passe bien au niveau des insertions, mais quand je fais
un select "from ProviderInfo" je recupere un pointeur de type "ProviderInfo " (ce qui est normal) mais j arrive pas a "caster" en pointeur de classe fille (en AdAccount par exemple). Cela veut dire qu il m est impossible d acceder aux objets des classes filles stocker en faisant uniquement un "from ProviderInfo".
Peux tu me dire STP comment je peux faire cela.

Merci de me repondre.


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.