Ik heb een op zich simpele 1-N mapping tussen een object PictureInfo en PictureInfoValue.
Het idee is dat eerstgenoemde een beschrijving geeft (bv. Stijl) en de laatste mogelijke waardes bijhoudt (bv. romaans, gotisch, renaissance,...)
De databasetabellen zijn als volgt:
PICTURE_INFO (ID, DESCRIPTION)
PICTURE_INFO_VALUE(ID, PICTURE_INFO_ID, DESCRIPTION, SEQUENCE)
De objecten zijn even simpel, PictureInfo is geannoteerd met @Entity en heeft een List van PictureInfoValues.
PictureInfoValue daarentegen, heb ik als Embeddable gemapped. Zo een object kan niet op zich bestaan, dus diens levenscyclus wordt beheerd door z'n parent.
In de database heeft PICTURE_INFO_VALUE wél een id. Hibernate heeft hier geen weet van, maar deze wordt simpelweg door de DB beheerd, en die heb ik ook nodig om pictures naar een invulling te laten refereren.
Nu heb ik en PictureInfo, volgende mapping:
... wat me vrij compleet leek. However... toevoegen en updaten werkt perfect, verwijderen daarentegen:
Wanneer ik bij volgende invulling:
... de middelste waarde (gotisch) verwijder, wordt het eindresultaat:
Maw. ik verwacht dat voor deze tabel het record met ID 2 wordt verwijderd, maar in plaats daarvan wordt ID 3 verwijderd en de waarden voor ID 2 vervangen met diegene van ID 3.
Hetgeen hibernate uitvoert is:
To make a long story short: waarom kan hibernate niet gewoonweg de sequence aanpassen ipv. de description van het record dat eigenlijk verwijderd moet worden, aan te passen? Zit er nog ergens een fout in mijn mapping/logica, of kan ik hetgeen ik beoog niet verwezenlijken met hibernate?
smallprint: gebruikte versies: hibernate 3.2.5, hibernate-annotaions 3.2.0.ga
Het idee is dat eerstgenoemde een beschrijving geeft (bv. Stijl) en de laatste mogelijke waardes bijhoudt (bv. romaans, gotisch, renaissance,...)
De databasetabellen zijn als volgt:
PICTURE_INFO (ID, DESCRIPTION)
PICTURE_INFO_VALUE(ID, PICTURE_INFO_ID, DESCRIPTION, SEQUENCE)
De objecten zijn even simpel, PictureInfo is geannoteerd met @Entity en heeft een List van PictureInfoValues.
PictureInfoValue daarentegen, heb ik als Embeddable gemapped. Zo een object kan niet op zich bestaan, dus diens levenscyclus wordt beheerd door z'n parent.
In de database heeft PICTURE_INFO_VALUE wél een id. Hibernate heeft hier geen weet van, maar deze wordt simpelweg door de DB beheerd, en die heb ik ook nodig om pictures naar een invulling te laten refereren.
Nu heb ik en PictureInfo, volgende mapping:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
| @CollectionOfElements(fetch=FetchType.EAGER) @Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN}) @JoinTable( name="PICTURE_INFO_VALUE", joinColumns={ @JoinColumn(name="PICTURE_INFO_ID") } ) @IndexColumn(name="sequence") @OrderBy("description") public List<PictureInfoValue> getValues() { return this.values; } |
... wat me vrij compleet leek. However... toevoegen en updaten werkt perfect, verwijderen daarentegen:
Wanneer ik bij volgende invulling:
| ID | PICTURE_INFO_ID | DESCRIPTION | SEQUENCE |
| 1 | 1 | romaans | 0 |
| 2 | 1 | gotisch | 1 |
| 3 | 1 | renaissance | 2 |
... de middelste waarde (gotisch) verwijder, wordt het eindresultaat:
| ID | PICTURE_INFO_ID | DESCRIPTION | SEQUENCE |
| 1 | 1 | romaans | 0 |
| 2 | 1 | renaissance | 1 |
Maw. ik verwacht dat voor deze tabel het record met ID 2 wordt verwijderd, maar in plaats daarvan wordt ID 3 verwijderd en de waarden voor ID 2 vervangen met diegene van ID 3.
Hetgeen hibernate uitvoert is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| Hibernate:
update
PICTURE_INFO
set
description=?
where
id=?
Hibernate:
delete
from
PICTURE_INFO_VALUE
where
PICTURE_INFO_ID=?
and sequence=?
Hibernate:
update
PICTURE_INFO_VALUE
set
description=?
where
PICTURE_INFO_ID=?
and sequence=? |
To make a long story short: waarom kan hibernate niet gewoonweg de sequence aanpassen ipv. de description van het record dat eigenlijk verwijderd moet worden, aan te passen? Zit er nog ergens een fout in mijn mapping/logica, of kan ik hetgeen ik beoog niet verwezenlijken met hibernate?
smallprint: gebruikte versies: hibernate 3.2.5, hibernate-annotaions 3.2.0.ga