[hibernate] subclass collection mapping

Pagina: 1
Acties:

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
Ik heb volgende situatie

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Reward  {
  priviate rewardId;
  private rewardProperty1;
  private rewardProperty2;
}

class Points extends Reward {
  private pointsProperty1;
  private pointsProperty2;
}

class Bounty extends Reward {
  private bountyProperty1;
  private bountyProperty2;
}

nu heb ik ook een klasse die een collectie van beide bevat :

Java:
1
2
3
4
class Definition {
  private List bountyList;
  private List pointsList;
}

ik wil dus dat ik nu via hibernate in de klasse definition een lijst van bounties en een lijst van points wordt opgehaald

volgende mapping heb ik:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<hibernate-mapping>
    <class name="Reward" table="reward-table" lazy="false">
        <id name="rewardId" type="long" unsaved-value="null">
            <generator class="identity"/>
        </id>
 <property name="rewardProperty1"/>

<joined-subclass name="Bounty" table="bounty-table">
            <key column="rewardId"/>
            <property name="bountyProperyt1"/>
        </joined-subclass>

        <joined-subclass name="Points" table="points-table">
            <key column="rewardId"/>
            <property name="pointProperty1"/>
        </joined-subclass>
</class>
</hibernate-mapping>


zoals je kan zien heb ik voor een Table per subclass persistence strategy gekozen, nu is men vraag hoe maak ik de mapping van de definition class ?

ik had iets in de aard van :

Java:
1
2
3
4
5
6
7
8
9
10
11
<hibernate-mapping>
    <class name="Definition" table="definition-table" lazy="false">
        <id name="definitionId" type="long" unsaved-value="null">
            <generator class="identity"/>
        </id>
        <bag name="pointsList" table="points-table"  cascade="all-delete-orphan" lazy="false" batch-size="1" outer-join="auto" >
            <key column="rewardId" not-null="false"/> 
            <one-to-many class="Bounty"/> 
        </bag>
    </class>
</hibernate-mapping>


het probleem zit hem in de mapping van de bag, hier wordt een table naam verwacht. En bij de key zit ik ook vast.... Hoe geef ik aan hibernate mee dat ik een subclass gebruik in men bag mapping ?

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:16
Moet je die on-to-many wel opnemen in je bag ?

https://fgheysels.github.io/


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Een bag is een tasje.

Je 'definition'-class heeft een tasje, met daarin 'rewards'.

Als tabel iets als:
Tasjestabel
-------------
int TasjeItemID
int DefinitionID
int RewardID

En de bijbehorende mapping:
code:
1
2
3
4
5
6
7
8
9
10
    <class name="definition" table="...">
        <cache usage="nonstrict-read-write"/>
        <id name="id" column="TasjeItemID" type="long" unsaved-value="-1"> <generator class="increment"/> </id>

        <idbag name="rewards" table="Tasjestabel" lazy="false"> 
            <collection-id column="id" type="long"> <generator class="increment"/> </collection-id>
            <key column="DefinitionID"/>
            <element column="RewardID" type="Reward"/>
        </idbag>
    </class>


edit:
Nu heb je dus de points en de bounties bij elkaar in je tasje. Je kunt dan met item.class.equals(bounty.class) of item.class.equals(points.class) onderscheid maken tussen de twee.

Wanneer je twee losse tasjes wilt, dan kan dat natuurlijk op dezelfde manier; maar dan snap ik niet waarom je joined-subclasses gebruikt

[ Voor 64% gewijzigd door Varienaja op 21-11-2005 14:42 ]

Siditamentis astuentis pactum.


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
whoami schreef op maandag 21 november 2005 @ 14:36:
Moet je die on-to-many wel opnemen in je bag ?
wel ik dacht het wel, dit geeft toch aan dat ik verschillende bounty's heb die maar bij 1 definition behoren. En hoe weet ie anders welke types er in men collectie zitten ?

[ Voor 33% gewijzigd door Cuball op 21-11-2005 14:39 ]

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
Varienaja schreef op maandag 21 november 2005 @ 14:38:
Een bag is een tasje.

Je 'definition'-class heeft een tasje, met daarin 'rewards'.
een tasje ? nu volg ik niet meer hoor :(

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
Java:
1
2
3
4
        <bag name="pointsList" cascade="all-delete-orphan" lazy="false" batch-size="1" outer-join="auto" 
            <key column="definitionId" not-null="false"/> 
            <one-to-many class="Points"/> 
        </bag>


als ik het zo doe krijg ik de foutmelding dat hij definitionId niet terug vindt in de tabel "points-table", moet ik voor elke subclass ook de foreign key (de verwijzing naar definitionId) in men tabellen overnemen? Is de verwijzing naar definitionId in men "basis tabel" niet genoeg ?

code:
1
2
3
4
5
6
Reward:
rewardId, definitionId, rewardProperty1, ..
Points:
rewardId, ??definitionId??, pointsProperty1, ...
Definition
definitionId, ...

zo dan ?

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
het lukt dus door in elke tabel die een subklasse voorstelt een verwijzing (foreign key) in te voegen naar de tabel (klasse) die een collectie van die subklasse bevat

"Live as if you were to die tomorrow. Learn as if you were to live forever"

Pagina: 1