Avatar billede eves Nybegynder
15. november 2007 - 15:32 Der er 3 kommentarer og
1 løsning

Hjælp til Hibernate Mapning

Hej...

Er gået lidt død i hibernate så håber i kan hjælpe...

Jeg prøver at lave denne simple select:

select s.*
  from person p, sag s
where p.cpr = '123456-1234'
  and s.sagNo = p.sagNo
 
Mine mapninger ser sådan her ud:

<class name="Person" table="PERSON">
  <id name="id" type="long">
    <column name="id" />
    <generator class="assigned" />
  </id>
  <property name="cpr" type="string">
    <column name="CPR" />
  </property>
  <property name="sagNo" type="long">
    <column name="SAGNO" />
  </property>
</class>

<class name="sag" table="Sag">
  <id name="id" type="long">
    <column name="ID"  />
    <generator class="assigned" />
  </id>
  <property name="sagNo" type="long">
    <column name="SAGNO" />
  </property> 
  <property name="detaljer" type="string">
    <column name="DETALJER" />
  </property> 
</class>

Jeg vil tror jeg mangler og lave et SET i mine mapninger, men det er her jeg går lidt død..
Hvordan skal de SET se ud? og hvordan skal mit Criteria se ud for at lave selecten
Avatar billede schwarz84 Nybegynder
15. november 2007 - 22:31 #1
Kort fortalt, så har du ikke lyst til at mappe id-numrene på den primitive måde som du gør i SQL. Hvis et tal (som her SAGNO) refererer til noget i en anden tabel, så har du lyst til at have begge dele som hver sin klasse hvor denne relation er mapper imellem. Dvs at du i stedet for at have Person.getSAGNO() af typen long hellere skal lave Person.getSAG() med typen Sag.
Først dit Criteria. Det kunne se sådan her ud:

Criteria c = session.createCriteria(Person.class);
c.add(Restrictions.eq("cpr","123456-1234");
Person p = (Person) c.uniqueResult();
Set<Sag> set = p.getSager();
//osv...

Nu skal vi lave mappingen. På Person har du så lavet en getSager() og på Sag har du en getPerson(). getPerson() kan laves på sag med følgende mapping:
<many-to-one name="person" class="Person" column="personId"/>
   
Settet af sager laves ved at tilføje følgende til Person-mapningen:
<set name="sager" table="Sag">
        <key column="personId" />
          <one-to-many class="Person">
</set>
Altså konstruerer den et set som består af alle sager som har personId=id på den person du har. Du mapper kort sagt aldrig ID-værdierne som du bruger til at refere, men lade hibernate klare det grove arbejde.
Avatar billede eves Nybegynder
16. november 2007 - 10:31 #2
Hej Schwarz84,

Mange tak for din hjælp!!!!

Jeg har dog et lille problem, når jeg siger getSager() på en person, får jeg et Set af personer?? og ikke af sager.

Hvad har jeg gjort forkert?
Avatar billede eves Nybegynder
16. november 2007 - 12:42 #3
Jeg har fundet en måde at løse problemet på med hjælp fra din løsning :)

Mapning af sager:

<many-to-one name="person" class="person" column="id" property-ref="sagNo"/>

Mapning af person:

<set name="sager" table="Sager">
  <key column="sagNo" property-ref="sagNo"/>
  <one-to-many class="sager" />
</set>

Mit Criteria:

Criteria criteria = session.createCriteria(Person.class);
criteria.add(Restrictions.eq("cprNr",cprNr));
criteria.createCriteria("sager", "sager", CriteriaSpecification.INNER_JOIN);
Person person = (Person) criteria.uniqueResult();
Set sager = person.getSager();
Avatar billede schwarz84 Nybegynder
16. november 2007 - 21:08 #4
Ja, det er en typo i eksemplet... class skal selvfølgelig være "sag"...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester