Als ik een simpel klassediagram teken en op basis daarvan Java-code schrijf, krijg ik andere code dan wanneer ik een ORM of persistentie gebruik.
Voorbeeld:

levert de code
En voor Boek iets wat hier op lijkt, maar dan voor Boek ;-). Let met name op 'getGeschreven()', waarmee ik alle Boeken voor die Auteur kan verkrijgen.
Als ik dit in de database ga opslaan, heb ik een koppeltabel nodig, want het is een many-to-many relatie.

Als ik de ORM/persistentie-tool (bijv. Cayenne of Propel) de code hiervoor laat genereren (nadat ik zelf de database heb opgezet heb), heb ik een extra klasse Auteurschap. En de klasse Boek kent geen Auteur meer, maar heeft een lijst van Auteurschap. Idem voor Boek.
Dit is onhandig. Auteurschap heeft verder geen attributen en ik wil geen extra klasse.
Bij one-to-many gebeurt is geen koppeltabel nodig en onstaat er ook geen extra klasse en gebeurt dit niet.
Ik kan er om heen werken door bijvoorbeeld in Auteur.java een methode te maken genaamd getGeschreven() die itereert over de Auteurschap-objecten (voor die Auteur) en de bijbehorende boeken verzameld in een lijst en deze retourneert en iets soortgelijks voor Boek.java.
Maar dan doe ik het laatste deel van de methode (maken van lijst met boeken) in software. Het lijkt me dat de database dat sneller kan.
Wat gaat hier mis en/of wat is de beste aanpak ?
Het enige boek wat in de buurt komt is het boek van Gertjan Laan (UML en java in de praktijk), maar dat eindigt (helaas) nadat persistentie en de vertaling van klassendiagram naar databasediagram behandeld is.Hoe dit in de praktijk werkt ontbreekt.
Kunnen jullie nog literatuur aanbevelen?
Voorbeeld:

levert de code
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
| import java.util.Collection; import java.util.ArrayList; public class Auteur { private String naam; private Collection<Boek> geschreven; public Auteur(){ naam = new String(); geschreven = new ArrayList<Boek>(); } public String getNaam(){ return naam; } public void setNaam(String n){ naam = n; } public Collection<Boek> getGeschreven(){ return geschreven; } public void addGeschreven(Boek b){ geschreven.add(b); } public void removeGeschreven(Boek b){ geschreven.remove(b); } } |
En voor Boek iets wat hier op lijkt, maar dan voor Boek ;-). Let met name op 'getGeschreven()', waarmee ik alle Boeken voor die Auteur kan verkrijgen.
Als ik dit in de database ga opslaan, heb ik een koppeltabel nodig, want het is een many-to-many relatie.

Als ik de ORM/persistentie-tool (bijv. Cayenne of Propel) de code hiervoor laat genereren (nadat ik zelf de database heb opgezet heb), heb ik een extra klasse Auteurschap. En de klasse Boek kent geen Auteur meer, maar heeft een lijst van Auteurschap. Idem voor Boek.
Dit is onhandig. Auteurschap heeft verder geen attributen en ik wil geen extra klasse.
Bij one-to-many gebeurt is geen koppeltabel nodig en onstaat er ook geen extra klasse en gebeurt dit niet.
Ik kan er om heen werken door bijvoorbeeld in Auteur.java een methode te maken genaamd getGeschreven() die itereert over de Auteurschap-objecten (voor die Auteur) en de bijbehorende boeken verzameld in een lijst en deze retourneert en iets soortgelijks voor Boek.java.
Maar dan doe ik het laatste deel van de methode (maken van lijst met boeken) in software. Het lijkt me dat de database dat sneller kan.
Wat gaat hier mis en/of wat is de beste aanpak ?
- Is dit gewoon een gevolg van dat het relationele model zich niet zonder meer laat vertalen naar een klassendiagram en vice versa?
- Is het in het algemeen moeilijk voor ORM/persistentie-tools om te bepalen of iets een koppeltabel is puur om many-to-many mogelijk te maken?
Het enige boek wat in de buurt komt is het boek van Gertjan Laan (UML en java in de praktijk), maar dat eindigt (helaas) nadat persistentie en de vertaling van klassendiagram naar databasediagram behandeld is.Hoe dit in de praktijk werkt ontbreekt.
Kunnen jullie nog literatuur aanbevelen?