Ik heb een vraag over lazy loading met (N)Hibernate.
Stel ik heb een systeem dat informatie over gerechten en ingredienten bevat. In hibernate heb ik dan een class Gerecht, met daarin een ISet Ingredienten.
Dit is ook netjes gemapt in xml voor NHibernate, werkt allemaal prima.
Stel ik heb 't volgende scherm:
Ik heb een lijstje met gerechten in beeld, en als ik op een van de gerechten klik, dan krijg ik daaronder de ingredienten te zien. Ik maak gebruik van lazy loading, dus de ingredienten worden NIET opgehaald op het moment dat de lijst met gerechten wordt getoond.
Nu laat ik de repository de data ophalen middels NHibernate, hiervoor wordt netjes een session geopend en gesloten. Hieronder is een voorbeeldje te zien van hoe dat werkt:
(Dit is slechts voorbeeldcode)
De IList met gerechten wordt vervolgens door wat lagen heen teruggegeven aan de Web UI laag.
Op het moment dat ik nu een van de gerechten op het scherm selecteer, wil ik de ingredienten zien. Op dat moment heeft NHibernate weer een open sessie nodig. Nu dus mijn probleem:
Vraag
Moet ik nou ineens in de Web UI een NHibernate sessie gaan openen, zodat de bijbehorende detail info opgehaald kan worden? Eigenlijk wil ik helemaal niet in mijn UI met NHibernate sessies gaan lopen rommelen.
Ik kan echter ook niet de sessie open houden, omdat dan uiteindelijk het updaten niet goed gaat, want dan heeft NHibernate ineens twee open sessies (Illegal attempt to associate a collection with two open sessions )
Hoe doen jullie zoiets?
Stel ik heb een systeem dat informatie over gerechten en ingredienten bevat. In hibernate heb ik dan een class Gerecht, met daarin een ISet Ingredienten.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public class Gerecht { public Gerecht() { } public virtual Int64 ID { get en set code } public virtual string Naam { get en set code } public virtual ISet Ingredienten { get { return ingredienten } set { ingredienten = value } } } |
Dit is ook netjes gemapt in xml voor NHibernate, werkt allemaal prima.
Stel ik heb 't volgende scherm:
Ik heb een lijstje met gerechten in beeld, en als ik op een van de gerechten klik, dan krijg ik daaronder de ingredienten te zien. Ik maak gebruik van lazy loading, dus de ingredienten worden NIET opgehaald op het moment dat de lijst met gerechten wordt getoond.
Nu laat ik de repository de data ophalen middels NHibernate, hiervoor wordt netjes een session geopend en gesloten. Hieronder is een voorbeeldje te zien van hoe dat werkt:
C#:
1
2
3
4
5
| ISession session = NHibernateHelper.GetCurrentSession(); ICriteria crit = session.CreateCriteria(typeof(Gerecht)); IList gerechten = crit.List(); NHibernateHelper.CloseSession(); |
(Dit is slechts voorbeeldcode)
De IList met gerechten wordt vervolgens door wat lagen heen teruggegeven aan de Web UI laag.
Op het moment dat ik nu een van de gerechten op het scherm selecteer, wil ik de ingredienten zien. Op dat moment heeft NHibernate weer een open sessie nodig. Nu dus mijn probleem:
Vraag
Moet ik nou ineens in de Web UI een NHibernate sessie gaan openen, zodat de bijbehorende detail info opgehaald kan worden? Eigenlijk wil ik helemaal niet in mijn UI met NHibernate sessies gaan lopen rommelen.
Ik kan echter ook niet de sessie open houden, omdat dan uiteindelijk het updaten niet goed gaat, want dan heeft NHibernate ineens twee open sessies (Illegal attempt to associate a collection with two open sessions )
Hoe doen jullie zoiets?