Ik hoop dat jullie zin hebben om door deze lap tekst heen te lezen, maar dit lijkt me een zeer interessant probleem. Je kan proberen het eerste stuk over te slaan en gelijk beginnen met het stukje onder 'Het Probleem'.
---
Ik ben bezig een forum te bouwen in jsp. Niet omdat ik per se een forum nodig heb, maar om wat ervaring op te doen met jsp/servlets etc. Laat je niet afschrikken als je niks met jsp doet, daar ligt het probleem niet waar ik het over wil hebben.
Ik heb nu een klasse Forum gemaakt, met attributen als 'forumId', 'title' en 'description'. Om een lijstje van forums weer te geven op de startpagina heb ik de klasse ForumDAO gemaakt, met de methode 'findAll'. Die geeft een Collection terug met daarin al de forums die er bestaan. (DAO = Data Access Object, die voert alle SQL sjit uit, zodat de klasse Forum zich daarmee niet hoeft te bemoeien)
Hetzelfde verhaal geld ook voor de klasse Topic, die heeft attrubuten zoals 'topicId' en 'subject'. Om een lijstje te maken van alle topics die in een bepaald forum zitten heb ik weer een DAO - TopicDAO in dit geval dus - met een methode findByForumId() die een Collection terugspuugt met instanties van Topic die in het gevraagde forum staan.
Bij een Topic hoort natuurlijk een User (die em gepost heeft). De meest correcte manier om een lijst van topics te maken zou als volgt zijn:
...
ok, ik hoop dat jullie nog niet slapen
...
Het Probleem:
Het nadeel is bij deze methode is dat voor elke onderwerp in de lijst een 'select from user' wordt uitgevoerd. Het zou natuurlijk veel sneller gaan als er in een keer een join wordt uitgevoerd op de tabbellen met de gevens voor topics en users. Maar dit levert wat mij betreft een niet helemaal "net" objectmodel op. (Waar ik aan denk is dat TopicDAO dus die join uitvoert en de klasse Topic een attribuut 'postUserName' ofzo heeft, ipv 'postUserId')
Mijn vraag aan jullie
Hoe zouden jullie dit probleem aanpakken, op de manier dat Topic een attribuut heeft met daarin gelijk de username ipv een userid, of hebben jullie een betere aanpak? Misschien een of andere constructie waarin TopicDAO en UserDAO samenwerken, en er een soort buffertje wordt bijgehouden waarin de gegevens van de join staan? Leef je uit!
---
Nog even een klein puntje voor de echt J2EE freaks: Jullie zullen mij wel willen adviseren om EJB's te gebruiken, die dit soort problemen al voor me regelen, maar ik vond in dit geval dat EJB's enzo gebruiken een beetje te vergelijken is met 'een kanon op een mug schieten'.
---
Ik ben bezig een forum te bouwen in jsp. Niet omdat ik per se een forum nodig heb, maar om wat ervaring op te doen met jsp/servlets etc. Laat je niet afschrikken als je niks met jsp doet, daar ligt het probleem niet waar ik het over wil hebben.
Ik heb nu een klasse Forum gemaakt, met attributen als 'forumId', 'title' en 'description'. Om een lijstje van forums weer te geven op de startpagina heb ik de klasse ForumDAO gemaakt, met de methode 'findAll'. Die geeft een Collection terug met daarin al de forums die er bestaan. (DAO = Data Access Object, die voert alle SQL sjit uit, zodat de klasse Forum zich daarmee niet hoeft te bemoeien)
Hetzelfde verhaal geld ook voor de klasse Topic, die heeft attrubuten zoals 'topicId' en 'subject'. Om een lijstje te maken van alle topics die in een bepaald forum zitten heb ik weer een DAO - TopicDAO in dit geval dus - met een methode findByForumId() die een Collection terugspuugt met instanties van Topic die in het gevraagde forum staan.
Bij een Topic hoort natuurlijk een User (die em gepost heeft). De meest correcte manier om een lijst van topics te maken zou als volgt zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| ...
// int forumId = het id van het forum waar we nu een lijst
// met topics voor maken
TopicDAO topicDAO = TopicDAO.getInstance();
UserDAO userDAO = UserDAO.getInstance();
Collection topicList = topicDAO.findByForumID(forumId);
Iterator topicIterator = topicList.iterator();
while(topicIterator.hasNext()) {
Topic topic = (Topic)topicIterator.next();
int userId = topic.getPostUserId(); // Levert de userId op van de user die
// het bericht geplaatst heeft
User user = userDAO.findByUserId(userId);
out.printLn("<tr>");
out.printLn(" <td>" + topic.getSubject() + "</td>");
out.printLn(" <td>" + user.getName() + "</td>");
out.printLn("</tr>");
}
... |
...
ok, ik hoop dat jullie nog niet slapen
...
Het Probleem:
Het nadeel is bij deze methode is dat voor elke onderwerp in de lijst een 'select from user' wordt uitgevoerd. Het zou natuurlijk veel sneller gaan als er in een keer een join wordt uitgevoerd op de tabbellen met de gevens voor topics en users. Maar dit levert wat mij betreft een niet helemaal "net" objectmodel op. (Waar ik aan denk is dat TopicDAO dus die join uitvoert en de klasse Topic een attribuut 'postUserName' ofzo heeft, ipv 'postUserId')
Mijn vraag aan jullie
Hoe zouden jullie dit probleem aanpakken, op de manier dat Topic een attribuut heeft met daarin gelijk de username ipv een userid, of hebben jullie een betere aanpak? Misschien een of andere constructie waarin TopicDAO en UserDAO samenwerken, en er een soort buffertje wordt bijgehouden waarin de gegevens van de join staan? Leef je uit!
---
Nog even een klein puntje voor de echt J2EE freaks: Jullie zullen mij wel willen adviseren om EJB's te gebruiken, die dit soort problemen al voor me regelen, maar ik vond in dit geval dat EJB's enzo gebruiken een beetje te vergelijken is met 'een kanon op een mug schieten'.