Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Java]Hibernate mapping object

Pagina: 1
Acties:

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Hoi!

Ik heb een probleem met hibernate in Java

Ik heb twee klassen X en Y ( om het simpel te houden )

klasse Y heeft alst variabele een object van de klasse X


Wanneer ik dit nu in hibernate wil mappen en ik doe dit:

Java:
1
2
3
4
5
6
<hibernate-mapping>
    <class name="model.Y" table="Y">
      ..Hier declartie voor ID kolommen...
    <property name="y" column="y"/>
  </class>
</hibernate-mapping>


Dan krijg ik steevast de fout "Could not determine type for y columns:...

Het probleem is dat ik een object van een klasse map en gene standaard variabele type.
Ik heb google al afgezocht maar nergens kom ik deze situatie tegen (of ik herken ze iig toch niet ).

Kan ik dit wel realiseren ? en zo ja hoe ?

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

In de Hibernate Reference Documentation staan vrij veel voorbeelden om de onderlinge relaties te vastleggen. Heb je daar niks aan gehad? Check hoofdstuk 7, Association Mappings.

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Jawel hoor , maar ik ga het ipv met X en Y uit te leggen concreet even uitleggen

Je hebt 2 klassen:

VERKOOP 1 ------- * RESERVATIE

1 verkoop bevat verschillende reservaties

dus in verkoop map ik een set van reservatie met een <one - to - many >
in verkoop heb ik ook een Set waarin ik eerst een hoop reservaties add voordat ik de gehele verkoop save .

Wanneer ik dit dan uitvoer en wanneer hij een reservatie wil saven dan doet hij geen insert op het verkoopId . Omdat ik in de mapping file van Reservatie niet heb gesproken over het verkoop veld ( het is een Verkoop object ).

Ik zou denken dat ik het zo moet mappen maar blijkbaar gaat er toch nog iets mis :s

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Ik kan gewoon een many - to - one mappen tussen reservatie en verkoop, dit lost het probleem volledig op

echter:

Dan moet je per reservatie een saveOrUpdate uitvoeren ipv dat je anders voor de verkoop alleen maar een saveOrUpdate zou moeten doen.


Als ik het zonder dit doe en:
De logging aanzet dan zie je heel duidellijk dat hij eerst een verkoop wegschrijft , en vervolgens een reservatie gaat aanmaken (dat klopt dus perfect) echter hij krijgt nergesne en verkoopId mee om in de reservatie mee op te nemen van het zonet aangemaakt verkoopObject...

Ik heb natuurllijk de save-or-update optie opgezet in de <set> tag van het xml mapping filetje .

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Fat Pizza's pizza, they are big and they are cheezy


  • Sv3n
  • Registratie: Mei 2002
  • Laatst online: 28-11 20:44
Kun je eens de echte mapping file posten, maakt het wat makkelijker :)

Last.fm
Films!


  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Aan cascading heb ik zoals eerder gezegd gedacht ik heb deze overal op cascade = all gezet.

De mapping files :

Reservatie.hbm.xml:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="model.Reservatie" table="reservatie">
        <id name="Id" column="id">
            <generator class="identity"/>
        </id>

        <many-to-one name="voorstelling" column="voorstellingId" cascade="all"/>
        <many-to-one name="zetel" column="zetelNr" cascade="all"/>
        <many-to-one name="verkoop" column="verkoopId" cascade="save-update"/>

    </class>
</hibernate-mapping>


Deze is nu met een <many-to-one en dit werkt, ik moet nu echter wel voor elke reservatie een save or update doen, wat niet gewenst is.

En dan hebben we verkoop.hbm.xml:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="model.Verkoop" table="verkoop">
        <id name="id" column="verkoopId">
            <generator class="identity"/>
        </id>
        <property name="locatie"/>
        <property name="betalingswijze"/>
        <property name="datum"/>
        <property name="betaald"/>

        <many-to-one name="klant" column="klantId" cascade="save-update"/>
        
        <set name="reservaties" cascade="save-update">
            <key column="verkoopId"/>
            <one-to-many class="model.Reservatie"/>
        </set>
    </class>
</hibernate-mapping>


En zo is zoals ik het wil, verkoop bevat een set van reservaties, en ik slaag eenmaal een verkoop op die alle bijhorende reservaties mee weg gaat schrijven .

Ik begrijp er niets meer van, ik gebruik deze techniek ook al in mijn programma en daar werkt het wel perfect.

Ziet er iemand wat ik verkeerd doe ?

  • bibawa
  • Registratie: Augustus 2005
  • Laatst online: 13-04-2008
Bedankt allemaal mensen ik ben eruit geraakt adhv het artikel over Cascading wat hierboven werd genoemd, daarin stond mijn probleem eigenllijk perfect uitgelegd bij een bidirectional many-to-one relatie , nu weten we ook weeral direct waarom dit is ...


Ik moest dus enkel het inverse=true attribuut extra bij opnemen in de set alsook een aanroep doen van het instellen van het verkoop bij het toevoegen van een reservatie aan een verkoop.

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

bibawa schreef op zondag 28 oktober 2007 @ 20:00:
Bedankt allemaal mensen ik ben eruit geraakt adhv het artikel over Cascading wat hierboven werd genoemd, daarin stond mijn probleem eigenllijk perfect uitgelegd bij een bidirectional many-to-one relatie , nu weten we ook weeral direct waarom dit is ...


Ik moest dus enkel het inverse=true attribuut extra bij opnemen in de set alsook een aanroep doen van het instellen van het verkoop bij het toevoegen van een reservatie aan een verkoop.
Het is altijd handig om aparte methoden te maken voor dergelijke mutaties.
Getter en setter beetje beveiligen kan ook altijd nog (UnmodifieableList en zo). Dan is je code weer wat veiliger.
Java:
1
2
3
4
5
6
7
8
9
10
11
class Reservatie {
    public void addVoorstelling(Voorstelling v) {
        this.voorstellingen.add(v);
        v.setReservatie(this);
    }

    public void removeVoorstelling(Voorstelling v) {
        this.voorstellingen.remove(v);
        v.setReservatie(null);
    }
}

Uit de losse pols getypt, dus risico op compilefouten. :)

Fat Pizza's pizza, they are big and they are cheezy

Pagina: 1