[Hibernate Annotations]id van @Embedded niet correct

Pagina: 1
Acties:
  • 327 views sinds 30-01-2008
  • Reageer

  • Ansur
  • Registratie: Januari 2004
  • Laatst online: 29-10 13:35
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:
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:
IDPICTURE_INFO_IDDESCRIPTIONSEQUENCE
11romaans0
21gotisch1
31renaissance2

... de middelste waarde (gotisch) verwijder, wordt het eindresultaat:
IDPICTURE_INFO_IDDESCRIPTIONSEQUENCE
11romaans0
21renaissance1

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

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
Heb je ook de precieze waarden van wat er op de plaats van die vraagtekens staat?

Hang anders iets als p6spy driver tussen hibernate en je eigenlijke driver.

  • Ansur
  • Registratie: Januari 2004
  • Laatst online: 29-10 13:35
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='Style' 
    where
        id=2
Hibernate: 
    delete 
    from
        PICTURE_INFO_VALUE 
    where
        PICTURE_INFO_ID=1 
        and sequence=2
Hibernate: 
    update
        PICTURE_INFO_VALUE 
    set
        description='Renaissance' 
    where
        PICTURE_INFO_ID=2 
        and sequence=3

Maw hibernate verwijderd simpelweg het laatste record (in principe het foute dus).