Goeiedag,
Ik ben bezig met het ontwerpen van een administratieve applicatie. De details van dit programma zijn niet belangrijk of interessant dus zal ik deze achterwege laten.Het programma moet de input van een gebruiker opvragen, hier eventueel wat berekeningen mee doen en dan opslaan in een database. Het programma moet deze input later uiteraard ook terug kunnen opvragen. Het is een 2-tier applicatie, dus elke client verbindt rechtstreeks met de database.
Oorspronkelijk wou ik dit doen met behulp van Hibernate, zodat ik minder last zou hebben met O/R-mapping. Maar bij nader inzicht blijkt dit een grote ontwerpfout te zijn. Hibernate is namelijk ongeschikt voor 2-tier applicaties. Ik zit nu met het probleem dat ik alle business objects heb ontworpen om te gebruiken met Hibernate, en dat ik daar nu van wil afstappen en gewoon JDBC in de plaats wil gebruiken. De andere mogelijkheid is om er toch een 3-tier applicatie van te maken, maar ik denk dat dat voor nog meer werk zou zorgen.
Ik heb al een tijdje nagedacht over hoe ik de code moet refactoren. Van de meeste zaken zoals hoe/waar/wanneer business objects aan te maken en op te slaan in de database heb ik al een idee. Die dingen zullen wel lukken. Maar ik heb problemen met hoe ik de properties en collections van de business objects moet veranderen. Ik kan dit het beste uitleggen met een voorbeeld.
Veronderstel de volgende situatie:
Ik heb een Employee-object dat een property 'name' heeft en een one-to-many associatie heeft met een aantal Diploma-objecten (een werknemer heeft één of meerdere diploma's). De Employee class zou er dan bijvoorbeeld als volgt uit kunnen zien:
Ik heb een aantal methodes zoals isValidName() en removeDiploma() weggelaten omdat die niet nodig zijn voor wat ik wil vragen.
Toen ik Hibernate gebruikte, werkte dit prima. Maar nu zal ik alles manueel d.m.v. JDBC moeten gaan laden en opslaan uit de database. Mijn vraag is nu hoe ik dit het beste aanpak?
Hier wordt alles dus direct gelezen/geschreven van/naar de database. Er zijn dus ook geen instantievariabelen meer nodig.
Alvast bedankt!
Ik ben bezig met het ontwerpen van een administratieve applicatie. De details van dit programma zijn niet belangrijk of interessant dus zal ik deze achterwege laten.Het programma moet de input van een gebruiker opvragen, hier eventueel wat berekeningen mee doen en dan opslaan in een database. Het programma moet deze input later uiteraard ook terug kunnen opvragen. Het is een 2-tier applicatie, dus elke client verbindt rechtstreeks met de database.
Oorspronkelijk wou ik dit doen met behulp van Hibernate, zodat ik minder last zou hebben met O/R-mapping. Maar bij nader inzicht blijkt dit een grote ontwerpfout te zijn. Hibernate is namelijk ongeschikt voor 2-tier applicaties. Ik zit nu met het probleem dat ik alle business objects heb ontworpen om te gebruiken met Hibernate, en dat ik daar nu van wil afstappen en gewoon JDBC in de plaats wil gebruiken. De andere mogelijkheid is om er toch een 3-tier applicatie van te maken, maar ik denk dat dat voor nog meer werk zou zorgen.
Ik heb al een tijdje nagedacht over hoe ik de code moet refactoren. Van de meeste zaken zoals hoe/waar/wanneer business objects aan te maken en op te slaan in de database heb ik al een idee. Die dingen zullen wel lukken. Maar ik heb problemen met hoe ik de properties en collections van de business objects moet veranderen. Ik kan dit het beste uitleggen met een voorbeeld.
Veronderstel de volgende situatie:
Ik heb een Employee-object dat een property 'name' heeft en een one-to-many associatie heeft met een aantal Diploma-objecten (een werknemer heeft één of meerdere diploma's). De Employee class zou er dan bijvoorbeeld als volgt uit kunnen zien:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| public class Employee { private String name; private final Set<Diploma> diplomas = new HashSet<Diploma>(2, 1f); public String getName() { return name; } public void setName(String name) { if (! isValidName(name)) throw new IllegalArgumentException("wrong name"); this.name = name; } public void addDiploma(Diploma diploma) { if (! isValidDiploma(diploma)) throw new IllegalArgumentException("bad diploma"); diplomas.add(diploma); } public Set<Diploma> getDiplomas() { return new HashSet<Diploma>(diplomas); } } |
Ik heb een aantal methodes zoals isValidName() en removeDiploma() weggelaten omdat die niet nodig zijn voor wat ik wil vragen.
Toen ik Hibernate gebruikte, werkte dit prima. Maar nu zal ik alles manueel d.m.v. JDBC moeten gaan laden en opslaan uit de database. Mijn vraag is nu hoe ik dit het beste aanpak?
- Moet ik alle wijzigingen aan de properties of collections van een object direct opslaan in de database?
- Als er een eigenschap of collection opgevraagd wordt, moet ik dan gewoon direct een verbinding maken met de database en een query doen voor de gegevens die er uit wil halen? Of moet ik deze gegevens cachen?
- Bij het laden van een object A, moet ik dan ook direct alle objecten B_i waar A een associatie mee heeft laden? En dan ook alle objecten C_j waar elk object B_i een associatie mee heeft? Dus bij het laden van een object, moet ik dan de volledige object-graph laden? Dit zou volgens mij te veel overhead geven, omdat niet de volledige object-graph gebruikt moet worden.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| public class Employee { public String getName() { String resultaat; MaakVerbindingMetDatabase(); resultaat = VoerSelectQueryUit(); SluitVerbindingMetDatabase(); return resultaat; } public void setName(String name) { if (! isValidName(name)) throw new IllegalArgumentException("wrong name"); MaakVerbindingMetDatabase(); VoerUpdateQueryUit(); SluitVerbindingMetDatabase(); } public void addDiploma(Diploma diploma) { if (! isValidDiploma(diploma)) throw new IllegalArgumentException("bad diploma"); MaakVerbindingMetDatabase(); VoerCreateQueryUit(); SluitVerbindingMetDatabase(); } public Set<Diploma> getDiplomas() { MaakVerbindingMetDatabase(); ResultSet result = VoerSelectQueryUit(); SluitVerbindingMetDatabase(); return ConverteerNaarSet(result); } } |
Hier wordt alles dus direct gelezen/geschreven van/naar de database. Er zijn dus ook geen instantievariabelen meer nodig.
- Is dit een goede aanpak of niet? Is er een betere manier?
- Hoe wordt dit normaal, meestal gedaan?
- Moet ik toch instantievariabelen gebruiken (om te cachen)?
Alvast bedankt!