-->
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: table-per-hierarchy and many discriminator values ?
PostPosted: Wed Aug 11, 2004 5:28 am 
Newbie

Joined: Tue Jul 13, 2004 7:34 am
Posts: 4
Hello, I don't know how to declare an intermediate subclass in Hibernate mapping file adding few properties, can someone help ?

I'm using a table-per-hierarchy strategy and so discriminator-value to map between different types of subclasses.

Here is the case (Hibernate version: 2.1.4) :

I'd like to have a base class Datasource declared as :

Code:
public abstract class Datasource


Then few concrete classes directly extending it :

Code:
public class ManualInputDatasource extends Datasource
public class FixedDatasource extends Datasource


And then to add key & query fields :
Code:
public abstract class WithKeyAndQueryDatasource extends Datasource
   private String key;
   private String query;


And next extending WithKeyAndQueryDatasource to concrete classes :

Code:
public class CSVDatasource extends WithKeyAndQueryDatasource
public class G2Datasource extends WithKeyAndQueryDatasource
public class V2Datasource extends WithKeyAndQueryDatasource


All I found is to forget the usage of intermediate WithKeyAndQueryDatasource class and have the following mapping, it works, but doesn't look the most beautiful mapping file ever, see red section repeated three times.

Mapping documents:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping package="com.mycompany.app">
<class name="Datasource" table="Tbl_Datasource">
<composite-id class="DatasourcePK" name="primaryKey">
<key-property
column="Id_Datasource"
name="idDatasource"
type="string"
/>
<key-many-to-one
class="Exhibit"
column="Id_Exhibit"
name="exhibit"
/>
</composite-id>
<discriminator
column="Cd_DatasourceType"
type="string"
/>
<subclass name="ManualInputDatasource" discriminator-value="MAN"/>
<subclass name="FixedDatasource" discriminator-value="FIX"/>
<subclass name="CSVDatasource" discriminator-value="CSV">
<property
column="Txt_key"
length="255"
name="key"
not-null="false"
type="string"
/>
<property
column="Cd_Query"
length="255"
name="query"
not-null="false"
type="string"
/>

</subclass>
<subclass name="G2Datasource" discriminator-value="GE2">
<property
column="Txt_key"
length="255"
name="key"
not-null="false"
type="string"
/>
<property
column="Cd_Query"
length="255"
name="query"
not-null="false"
type="string"
/>

</subclass>
<subclass name="V2Datasource" discriminator-value="EF2">
<property
column="Txt_key"
length="255"
name="key"
not-null="false"
type="string"
/>
<property
column="Cd_Query"
length="255"
name="query"
not-null="false"
type="string"
/>

</subclass>
</class>
</hibernate-mapping>

Whereas I'd like to be able to declare many discriminator values, so to have something like :
Code:
...<subclass name="WithKeyAndQueryDatasource" discriminator-values="{CSV,EF2,GE2}">
          <property
            column="Txt_key"
            length="255"
            name="key"
            not-null="false"
            type="string"
          />
          <property
            column="Cd_Query"
            length="255"
            name="query"
            not-null="false"
            type="string"
          />
         <subclass name="CSVDatasource" discriminator-value="CSV"/>
         <subclass name="G2Datasource" discriminator-value="GE2"/>
         <subclass name="V2Datasource" discriminator-value="EF2"/>
</subclass>...


How can I do this ? Any Idea ?
Thanx, r0main


Top
 Profile  
 
 Post subject:
PostPosted: Thu Aug 12, 2004 10:14 am 
Newbie

Joined: Thu Jul 08, 2004 7:16 am
Posts: 8
Hi!

why can't you continue to declare subclasses within subclasses? Similar to your proposed mapping? Is there a problem with abstract classes?


Code:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
   
<hibernate-mapping package="com.mycompany.app">
   <class name="Datasource" table="Tbl_Datasource">
      <composite-id class="DatasourcePK" name="primaryKey">
         <key-property column="Id_Datasource" name="idDatasource" type="string"/>
         <key-many-to-one class="Exhibit" column="Id_Exhibit" name="exhibit"/>
      </composite-id>
      
      <discriminator column="Cd_DatasourceType" type="string" />
      
      <subclass name="ManualInputDatasource" discriminator-value="MAN"/>
      <subclass name="FixedDatasource" discriminator-value="FIX"/>
      <subclass name="WithKeyAndQueryDatasource" discriminator-value="WKQ">
         <property column="Txt_key" length="255" name="key" not-null="false" type="string" />
         <property column="Cd_Query" length="255" name="query" not-null="false" type="string" />
         
         <subclass name="CSVDatasource" discriminator-value="CSV"/>
         <subclass name="G2Datasource" discriminator-value="GE2"/>
         <subclass name="V2Datasource" discriminator-value="EF2"/>
      </subclass>
   </class>
</hibernate-mapping>



Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 13, 2004 4:37 am 
Newbie

Joined: Tue Jul 13, 2004 7:34 am
Posts: 4
Hi, thanks for the reply...
The fact is, in your suggested declaration :

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping package="com.mycompany.app">
<class name="Datasource" table="Tbl_Datasource">
<composite-id class="DatasourcePK" name="primaryKey">
<key-property column="Id_Datasource" name="idDatasource" type="string"/>
<key-many-to-one class="Exhibit" column="Id_Exhibit" name="exhibit"/>
</composite-id>

<discriminator column="Cd_DatasourceType" type="string" />

<subclass name="ManualInputDatasource" discriminator-value="MAN"/>
<subclass name="FixedDatasource" discriminator-value="FIX"/>
<subclass name="WithKeyAndQueryDatasource" discriminator-value="WKQ">
<property column="Txt_key" length="255" name="key" not-null="false" type="string" />
<property column="Cd_Query" length="255" name="query" not-null="false" type="string" />

<subclass name="CSVDatasource" discriminator-value="CSV"/>
<subclass name="G2Datasource" discriminator-value="GE2"/>
<subclass name="V2Datasource" discriminator-value="EF2"/>
</subclass>
</class>
</hibernate-mapping>

My db is so I cannot add another discriminator column and am forced to use the "Cd_DatasourceType" one (definition is in BLUE).

The real problem is we may need to have more than one possible value for a given discriminator related to a class.

So in your declaration, the line :
Code:
<subclass name="WithKeyAndQueryDatasource" discriminator-value="WKQ">


may become :
Code:
<subclass name="WithKeyAndQueryDatasource" discriminator-in-values="CSV GE2 EF2">


If only a multiple-values discriminator switch was permitted...

Romain


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.