Toon posts:

[C#] Geneste object collection NHibernate

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:
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..
Dat werkt prima zo. Echter zou ik graag zien dat ik een ArrayList in dat object zou hebben met GebruikersGroep objecten. Dus dat ik niet meer de 'ruwe' GebruikergroepData objecten. Zo dus:
  • - Obj gebruikersgroep:
    • - ArrayList GebruikersgroepGebruiker:
      • [0] - Obj Gebruiker
      • [1] - Obj Gebruiker
        • - ArrayList GebruikerGebruikersgroep:
          • [0] - Obj Gebruikersgroep
            • En zo oneindig door..
Hoe kan ik dat het beste doen?

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.
Hoe kan ik dit het beste doen zonder de nesting aan beide kanten te verbreken?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Waarom ga je -als je NHibernate gebruikt- je domain classes gaan mappen naar Data- classes ? Het voordeel van Hibernate is nu eenmaal dat (N)Hibernate de mapping tussen je domain class en je Database op zich neemt. Waarom wil je er nog een stap tussen ?

Wat je wel kunt doen -heb ik zelf nog niet gedaan- is je domein-object mappen naar een UI-object, maar volgens mij ga je nu veel te complex te werk.
Je kunt ervoor kiezen om 'repositories' te maken die via NHibernate de DB accessen en je domein objecten laden / opslaan.

https://fgheysels.github.io/