Beste mensen,
Om wat ervaring op te doen met NHibernate en het gebruik van layers in een applicatiemodel, heb ik een testje opgezet wat als volgt in elkaar zit:
Allereerst heb ik een drietal applicatielagen gemaakt.
- Presentation layer
- Business layer
- Data layer
De vraag die ik heb betreft de interactie tussen de Data en de Business layer.
Ik heb de volgende objecten gemaakt in de business laag:
Class Gebruiker
Properties:
- GebruikerId
- GebruikerGebruikersnaam
- GebruikerWachtwoord
- GebruikerGebruikersgroep (Deze ArrayList moet straks correct gevult worden)
- GebruikerGebruikersgroepData (ArrayList met GebruikersgroepData objecten. Deze wil ik straks niet meer nodig hebben)
Methods:
- Gebruiker (constructor, bevat code om de class te vullen met gegevens uit class GebruikerData)
- GebruikerOpslaan (bevat code om object Gebruiker te vertalen naar GebruikerData object en op te slaan)
Class Gebruikersgroep
Properties:
- GebruikersgroepId
- GebruikersgroepNaam
- GebruikersgroepGebruikerData (ArrayList met GebruikerData objecten. Deze wil ik niet meer nodig hebben)
- GebruikersgroepGebruiker (Deze moet straks correct gevult worden)
Methods:
- Gebruikersgroep (constructor, bevat code om de class te vullen met gegevens uit class GebruikersgroepData)
- Opslaan (bevat code om object terug te vertalen naar GebruikersgroepData object)
In de datalaag bevinden zich de classes GebruikersgroepData en GebruikerData. Deze classes zijn gemapt aan de tabellen in de database.
Class GebruikersgroepData
Properties:
GebruikersgroepId
GebruikersgroepNaam
GebruikersgroepGebruikerData
Class GebruikerData
Properties:
GebruikerId
GebruikerGebruikersnaam
GebruikerWachtwoord
GebruikerGebruikersgroepData
Voor de class GebruikerData gebruik ik deze mapping:
En voor de class GebruikersgroepData
Nu is mijn probleem eigenlijk, dat als ik de mapping zo uitvoer als nu, en ik voer de volgende code uit:
Dan krijg ik het Gebruiker object terug met daarin de property gebruikerGebruikersgroepData die een ArrayList bevat met GebruikersgroepData objecten. zo dus:
Wat ik al geprobeerd heb of over nagedacht heb:
Om wat ervaring op te doen met NHibernate en het gebruik van layers in een applicatiemodel, heb ik een testje opgezet wat als volgt in elkaar zit:
Allereerst heb ik een drietal applicatielagen gemaakt.
- Presentation layer
- Business layer
- Data layer
De vraag die ik heb betreft de interactie tussen de Data en de Business layer.
Ik heb de volgende objecten gemaakt in de business laag:
Class Gebruiker
Properties:
- GebruikerId
- GebruikerGebruikersnaam
- GebruikerWachtwoord
- GebruikerGebruikersgroep (Deze ArrayList moet straks correct gevult worden)
- GebruikerGebruikersgroepData (ArrayList met GebruikersgroepData objecten. Deze wil ik straks niet meer nodig hebben)
Methods:
- Gebruiker (constructor, bevat code om de class te vullen met gegevens uit class GebruikerData)
- GebruikerOpslaan (bevat code om object Gebruiker te vertalen naar GebruikerData object en op te slaan)
Class Gebruikersgroep
Properties:
- GebruikersgroepId
- GebruikersgroepNaam
- GebruikersgroepGebruikerData (ArrayList met GebruikerData objecten. Deze wil ik niet meer nodig hebben)
- GebruikersgroepGebruiker (Deze moet straks correct gevult worden)
Methods:
- Gebruikersgroep (constructor, bevat code om de class te vullen met gegevens uit class GebruikersgroepData)
- Opslaan (bevat code om object terug te vertalen naar GebruikersgroepData object)
In de datalaag bevinden zich de classes GebruikersgroepData en GebruikerData. Deze classes zijn gemapt aan de tabellen in de database.
Class GebruikersgroepData
Properties:
GebruikersgroepId
GebruikersgroepNaam
GebruikersgroepGebruikerData
Class GebruikerData
Properties:
GebruikerId
GebruikerGebruikersnaam
GebruikerWachtwoord
GebruikerGebruikersgroepData
Voor de class GebruikerData gebruik ik deze mapping:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="OpMaat.OpMaatDataLayer.GebruikerData, OpMaat.OpMaatDataLayer" table="gebruiker" lazy="false"> <id name="GebruikerId" column="gebruiker_id" unsaved-value="0" type="Int32"> <generator class="assigned" /> </id> <property name="GebruikerGebruikersnaam" column="gebruiker_gebruikersnaam" type="String" length="20"/> <property name="GebruikerWachtwoord" column="gebruiker_wachtwoord" type="String" length="20"/> <bag cascade="all" name="GebruikerGebruikersgroepData" table="gebruikersgroep_gebruiker" lazy="true"> <key column="gebruiker_id"/> <many-to-many class="OpMaat.OpMaatDataLayer.GebruikerData, OpMaat.OpMaatDataLayer" column="gebruikersgroep_id"/> </bag> </class> </hibernate-mapping> |
En voor de class GebruikersgroepData
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="OpMaat.OpMaatDataLayer.GebruikersgroepData, OpMaat.OpMaatDataLayer" table="gebruikersgroep" lazy="false"> <id name="GebruikersgroepId" column="gebruikersgroep_id" unsaved-value="0" type="Int32"> <generator class="assigned" /> </id> <property name="GebruikersgroepNaam" column="gebruikersgroep_naam" type="String" length="20"/> <property name="GebruikersgroepOmschrijving" column="gebruikersgroep_omschrijving" type="String"/> <bag cascade="all" name="GebruikersgroepGebruikerData" table="gebruikersgroep_gebruiker" lazy="true"> <key column="gebruikersgroep_id"/> <many-to-many class="OpMaat.OpMaatDataLayer.GebruikerData, OpMaat.OpMaatDataLayer" column="gebruiker_id"/> </bag> </class> </hibernate-mapping> |
Nu is mijn probleem eigenlijk, dat als ik de mapping zo uitvoer als nu, en ik voer de volgende code uit:
C#:
1
| Gebruikersgroep gebruikersgroep = new Gebruikersgroep(1); |
Dan krijg ik het Gebruiker object terug met daarin de property gebruikerGebruikersgroepData die een ArrayList bevat met GebruikersgroepData objecten. zo dus:
- - Obj gebruikersgroep:
- - ArrayList GebruikersgroepGebruikerData:
- [0] - Obj GebruikerData
- [1] - Obj GebruikerData
- - ArrayList GebruikerGebruikersgroepData:
- [0] - Obj GebruikersgroepData
- En zo oneindig door..
- [0] - Obj GebruikersgroepData
- - ArrayList GebruikerGebruikersgroepData:
- - ArrayList GebruikersgroepGebruikerData:
- - Obj gebruikersgroep:
- - ArrayList GebruikersgroepGebruiker:
- [0] - Obj Gebruiker
- [1] - Obj Gebruiker
- - ArrayList GebruikerGebruikersgroep:
- [0] - Obj Gebruikersgroep
- En zo oneindig door..
- [0] - Obj Gebruikersgroep
- - ArrayList GebruikerGebruikersgroep:
- - ArrayList GebruikersgroepGebruiker:
Wat ik al geprobeerd heb of over nagedacht heb:
- Mappingfile aanmaken voor de Gebruiker en Gebruikersgroep class. Echter is dat geen nette oplossing omdat je dat object dan met twee verschillende mapping files uit je database haalt en weer terug stopt.
- Elk GebruikerData object converteren naar een Gebruiker object in de GebruikersgroepGebruiker Collection. Echter als je dan de GebruikersgroepData objecten in de GebruikerGebruikersgroepData collection ook converteerd van GebruikersgroepData naar Gebruikersgroep objecten, resulteert dat in een StackOverflow Exception. Logisch omdat dan alle geneste objecten dan eindeloos worden geconverteerd.