Hibernate werkt ook met proxies waardoor er optimaal kan gebruik worden gemaakt van lazy loading.
Stel je voor dat je user bv een order opvraagt.
User -> Front (webapp/gui) -> BL -> DAL -> DB
Normaal word de nodige informatie uit de DB gehaalt door de DAL en in een Domain object gegoten.
Dit wordt dan terug gegeven (via Business Logic) aan de Front end.
Nu weet de BL en de DAL niet wat er allemaal met dat domein object gaat gebeuren. Aangezien het om een order gaat zou je alle order detail lijnen reeds kunnen ophalen uit de DB en die reeds in je domein object als een collectie laden.
- Maar wat als er een lijst van orders wordt opgevraagt? Ga je dan ook op voorhand alle orderdetails laden uit de DB. Wellicht heeft de user er slechts 1 order+detials nodig.
- Wat als de user de klant gegevens van dat order wil bekijken?
Een oplossing is natuurlijk dat de frontend aan de BL vraagt als hij bv een lijst van order details nodig heeft. Maar dit resulteerd in een veel omslachtigere BL en DAL.
Want je hebt in je OrderManager niet alleen
code:
1
| public Order getOrder(int orderId); |
nodig maar ook
code:
1
| public List<OrderDetail> getOrderDetails(int orderId); |
nodig.
Voor dergelijke senarios is Hibernate (met proxies & lazy loading) uitermate geschikt. Je vraag immers je Order domain object op via je BL waarbij enkel de eigen velden worden geladen. Echter kan je aan je domein object zelf vragen getOrderDetails waarbij, mocht deze collectie nog niet geladen zijn, alle order details uit de DB geladen worden op het moment dat je ze nodig hebt (opvraagt).
Het nadeel is dat er geen gebruik wordt gemaakt van joins voor het ophalen van een order samen met zijn detail. (dus geen SELECT * FROM order INNER JOIN orderDetail ON ...) maar aan de andere kant worden er ook geen gegevens opgehaalt die je niet nodig hebt.
Bij dingen die je bij een bepaalde entity wel altijd nodig hebt ( bv Product en ProductLanguageInformation zoals de NL, FR, EN, ... naam) kan je aanduiden dat je geen gebruik wilt maken van lazy loading.
PS:
Ik schreef
Het nadeel is dat er geen gebruik wordt gemaakt van joins voor het ophalen van een order samen met zijn detail.
Dit nadeel is zelfs niet volledig waar. Je kan, als je een bepaalde entiy ophaalt, een aantal parameters meegeven die de manier van ophalen beinvloed waarbij er wel gebruik wordt gemaakt van joins en bv ook lazy loading kan negeren.