Avatar billede uklo Nybegynder
17. februar 2006 - 13:41 Der er 16 kommentarer og
1 løsning

Relation mellem klasser

Jeg har i min database 1:m relation mellem tabellerne hold og elever, hvor et hold kan have mange elever. Jeg har derfor oprettet to classes i koden, hvor der i hold er et array, som skal indeholde elever. Det virker fint, men hvordan får jeg smartest puttet dataene fra databasen ind?
Avatar billede tjp Mester
17. februar 2006 - 13:56 #1
Du laver fx en metode 'addElev(elevObjekt)' i klassen Hold.
Avatar billede uklo Nybegynder
17. februar 2006 - 14:24 #2
Ok, men skal jeg så først lave en forespørgsel, som finder alle klasser og derefter en forespørgsel for hver klasse som finder eleverne til klassen, som kan puttes i addelev(elevobject) i klassen hold?
Avatar billede uklo Nybegynder
17. februar 2006 - 14:30 #3
Kan du uddybe dit eksempel med kode - klasserne og metoderne.
Avatar billede arne_v Ekspert
17. februar 2006 - 17:05 #4
til inspiration:

public class Hold {
    private List elever = new ArrayList();
    ...
    public addElev(Elev e) {
      elever.add(e);
    }
    public int antalElever() {
      return elever.size();
    }
    public Elev getElev(int no) {
        return (Elev)elever.get(no);
    }
}
Avatar billede uklo Nybegynder
17. februar 2006 - 17:24 #5
Tak for det arne_v. Hvor kan jeg læse lidt mere om mapping fra uml til jave eller andet OO-sprog. Jeg er helt grøn.
Avatar billede uklo Nybegynder
18. februar 2006 - 00:11 #7
Det jeg mente var hvorledes de forskellige typer af relationer skal implementeres i java. Noget der uddyber det eksempel, som du kom med.
Avatar billede uklo Nybegynder
18. februar 2006 - 12:02 #8
Nedenstående eksempel er i PHP og ikke java, men det er ikke relevant for mit spørgsmaal. (1)Er det en fornuftig OO struktur. (2)Hvordan vil oprettelsen af objekterne kunne laves hvis de kommer fra en database med tabellerne klasse og elev, hvor en klasse kan have flere elever og en elev kan kun være i en klasse.

Kode:

<?php
/*****************************Klasser*******************************/
class elev {
  var $elevnavn;
 
  function elev($elevnavn)
  {
      $this->elevnavn=$elevnavn;   
  }
  function getElevnavn ()
  {
    return $this->elevnavn;
  }
}

class klasse {
 
  var $klassenavn;
  var $elever;
  function klasse($klassenavn)
  {
      $this->klassenavn=$klassenavn;   
  }
 
  function addElev($elev)
  {
      $this->elever[]= $elev;
  }
 
  function getKlassenavn ()
  {
    return $this->klassenavn;
  }
  function getElever()
  {
    return $this->elever;
  }
}


/*****************************Oprettelse af objekter************************/

$klasser = array(new klasse("Klasse 1"),new klasse("Klasse 2"));

$klasser[0]->addElev(new elev ("Bent Hansen"));
$klasser[0]->addElev(new elev ("Johny Johnson"));
$klasser[0]->addElev(new elev ("Ulla Jola"));
$klasser[0]->addElev(new elev ("Randi haugaard"));
$klasser[0]->addElev(new elev ("Søren Larsen"));
$klasser[1]->addElev(new elev ("johny madsen"));
$klasser[1]->addElev(new elev ("Nina Larsen"));


/*******************************Udskrift af objekter**************************/

$klassetaeller=0;
While ($klassetaeller<count($klasser))
{
      echo "<BR>";
    echo $klasser[$klassetaeller]->getKlassenavn(); echo "<P>"; 
   
    $elever=$klasser[$klassetaeller]->getElever();
    $elevtaeller=0;
    while($elevtaeller<count($elever))
    {
      echo $elever[$elevtaeller]->getElevnavn(); echo "<BR>";
      $elevtaeller++;
    }
   
    $klassetaeller++;
}

?>

Output:

Klasse 1
Bent Hansen
Johny Johnson
Ulla Jola
Randi haugaard
Søren Larsen

Klasse 2

johny madsen
Nina Larsen
Avatar billede arne_v Ekspert
18. februar 2006 - 23:50 #9
i java vil 1 og 0..1 blive til:

private C o;

mens 0..m bliver til:

private List a;

eller i Java 1.5:

private List<C> a;
Avatar billede arne_v Ekspert
18. februar 2006 - 23:50 #10
jeg vender tilbage til PHP koden imorgen
Avatar billede arne_v Ekspert
21. februar 2006 - 23:00 #11
det tog saa lidt laengere tid ...

den PHP kode er ikke helt ved siden af

i Java ville man nok foelge bean konvention (og have noget private public), men det
er en detalje

laese fra database burde vaere lige ud af landevejen

du aabner klasse tabellen og laser alle klasser og opretter et objekt
for hver (i Java vil du nok gemme dem i en HashMap - i PHP i et associativt array)

derefter aabner du elev tabellen og laeser en elev af gangen, opretter et objekt for
hver og tilfoejer dem til den rigtige klasse

PS: Hvis associationen skal vaere bidirectional skal elev ogsaa have en reference
til den klasse som han/hun tilhoerer - i objekt modellen - ikke i den relationelle
database
Avatar billede uklo Nybegynder
22. februar 2006 - 09:36 #12
Hvis jeg forstår dig rigtig skal jeg så lave to forespørgsler og lagre primærnøglerne i objekterne, så jeg senere kan oprette relationerne mellem objekterne. I psydokode:

SELECT * FROM klasse;

while(tupler findes)
{
klassearray[]=new klasse('klassenavn',....,'klasseID')
}

SELECT * FROM Elev

while(tupler findes)
{
  if(search.klassearray->getKlasseid=='klasseid')
  {
    klassearray->addElev(new elev('elevobjekt'))
  }
}
Avatar billede arne_v Ekspert
22. februar 2006 - 15:11 #13
ja

(den if vil jeg bare lave som et opslag paa klassenavne ...)
Avatar billede uklo Nybegynder
22. februar 2006 - 22:50 #14
Er det ikke ressourcekrævende at lave en forespørgsel mere til databasen for at tjekke hvilken klasse en elev tilhører. Så er man oppe på tre forespørgsler. Dog kun med en join.
Avatar billede uklo Nybegynder
22. februar 2006 - 22:51 #15
Arne_v - poster du ikke et svar så du kan få nogle point.
Avatar billede arne_v Ekspert
22. februar 2006 - 22:57 #16
det bliver da kun til 2 queries - "SELECT * FROM elev" returnerer vel klassen

du kan ogsaa godt lave en query med en JOIN (og teste for naar klassen aendres)

alt ovenfor antager at man skal loade alle data fra database til memory i praksis
kan man forestille sig andre brugs moenstre

SELECT navn FROM klasse
bruger vaelger klasse
SELECT * FROM klasse WHERE navn = X
opret klasse objekt
SELECT * FROM elev WHERE klasse = Y
opret elev objekter og add til klasse

var ogsaa en mulighed

et kendt begreb er "lazy loading" hvor man ved oprettelse af klasse objektet
ikke henter eleverne, men foerst henter dem fra databasen naar de faktisk skal
bruges

det kan give en markant bedre performance hvis man ikek altid skal bruge
eleverne

og et svar
Avatar billede uklo Nybegynder
23. februar 2006 - 13:20 #17
Ok og tak for hjælpen..
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