Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[NHibernate] table-per-concrete-class mapping

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een class klant met de naw-gegevens.
Hieronder hangen 2 classes HoofdKlant en SubKlant, welke dus de gegevens van klant erven.

Nu wil ik dat mappen naar de database via de table-per-concrete-class methode.

Ik heb de volgende info:
http://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

Nu heb ik de HoofdKlant en de SubKlant gemapped, hierin heb ik ook de property's van de class Klant opgenomen. Ik heb de code van 1 class onderaan toegevoegd.

Als ik nu de applicatie start krijg ik de melding:
An association from the table tbl_project refers to an unmapped class: Klant

Ik heb ook nog geen mapping gemaakt voor de hoofd-class. Maar ik kan ook niet echt uit dat document opmaken wat de bedoeling is.

Heeft iemand ervaring met het mappen hiervan?

XML:
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
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="Weekstaat.Domein"
                   assembly="Weekstaat">
  <class name="HoofdKlant" table="tbl_Klant">
    <id name="KlantNummer" type="int" column="klantNummer">
      <generator class="native"/>
    </id>
    <property name="Naam" column="naam" type="String"/>
    <property name="Adres" column="adres" type="String"/>
    <property name="Postcode" column="postcode" type="String"/>
    <property name="Woonplaats" column="woonplaats" type="String"/>
    <property name="Postbus" column="postbus" type="int"/>
    <property name="PostbusPostcode" column="postbusPostcode" type="String"/>
    <property name="Telefoon" column="telefoon" type="String"/>
    <property name="Email" column="email" type="String"/>
    <property name="Fax" column="fax" type="String"/>
    <property name="Contactpersoon" column="contactpersoon" type="String"/>
    <property name="ContactpersoonEmail" column="contactpersoonEmail" type="String"/>
    <property name="ContactpersoonTelefoon" column="contactpersoonTelefoon" type="String"/>
    <property name="Kvk" column="kvk" type="int"/>
    <property name="BtwNummer" column="btwNummer" type="String"/>
    <property name="ProjectenGescheiden" column="projectenGescheiden" type="Boolean"/>
    <many-to-one name="Vestiging" column="vestigingNummer" class="Weekstaat.Domein.Vestiging, Weekstaat"/>
    <any name="Klant" meta-type="class" id-type="int">
      <column name="naam"/>
      <column name="adres"/>
      <column name="postcode"/>
      <column name="woonplaats"/>
      <column name="postbus"/>
      <column name="postbusPostcode"/>
      <column name="telefoon"/>
      <column name="email"/>
      <column name="fax"/>
      <column name="Contactpersoon"/>
      <column name="naContactpersoonEmail"/>
      <column name="ContactpersoonTelefoon"/>
    </any>
  </class>
</hibernate-mapping>

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het any element is volgens mij alleen bedoeld om te verwijzen naar een Klant instantie ( Soort van many-to-one element ). Dus in je project mapping moet je any gebruiken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Oke, ik ga het nu even testen. En dan post ik de resultaten.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je moet dan in je projecten table wel zorgen dat er een collumn is waardoor bepaald kan worden welk type Klant het is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Oke. Had je reply nog niet gelezen.

Ik heb een column klantNummer en dan maak ik een column klantType aan.

Dan de mapping:

XML:
1
2
3
4
<any name="Klant" id-type="int" meta-type="class">
      <column name="klantNummer"/>
      <column name="klantType"/>
</any>

[ Voor 175% gewijzigd door Verwijderd op 09-05-2008 16:55 ]


Verwijderd

Topicstarter
Nou, de applicatie draait. De mappings geven geen errors meer. Heb het gedaan, zoals hierboven aangegeven.

Verwijderd

Topicstarter
Alle projecten en klanten zitten in de applicatie.
Alleen lukt het me nog niet om alle projecten uit de database te krijgen gesorteerd op klantnaam. Op de een of andere manier lukt dat niet.

Ik probeer het telkens met een join, maar volgens mij is dat geen goede oplossing. Er zijn namelijk 2 tabellen. tbl_subklant en tbl_hoofdklant. Echter erven ze allebei van het object klant.

C#:
1
IList alleProjecten = currentSession.CreateQuery("FROM Project as p INNER JOIN p.Klant as k where p.Actief = 1 order by k.Naam").List();


Deze query sorteert op de naam van het project ipv de klant. Klant is dus een property van project. Een klant kan een Hoofdklant of een Subklant zijn.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik ben niet zo heel erg thuis in Hibernate queries maar kan je niet het volgende doen

code:
1
FROM Project as p WHERE p.Actief = 1 ORDER BY p.Klant.Naam

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Had ik inderdaad ook al geprobeerd.

Dan krijg je de volgende foutmelding:

could not resolve property: Klant.Naam of: Weekstaat.Domein.Project [FROM Weekstaat.Domein.Project as p WHERE p.Actief = 1 ORDER BY p.Klant.Naam]

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 14 mei 2008 @ 15:42:
Had ik inderdaad ook al geprobeerd.

Dan krijg je de volgende foutmelding:

could not resolve property: Klant.Naam of: Weekstaat.Domein.Project [FROM Weekstaat.Domein.Project as p WHERE p.Actief = 1 ORDER BY p.Klant.Naam]
Dat komt waarschijnlijk omdat je Klant niet gemapped hebt en die heeft dus geen Naam property in de mapping van NHibernate.

Mischien zul je je mapping toch wat anders op moeten zetten.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Klant is op de volgende manier gemapped in de class project.:

XML:
1
2
3
4
<any name="Klant" id-type="int" meta-type="class">
      <column name="klantType"/>
      <column name="klantNummer"/>      
</any>


Dit werkt opzich goed, alleen dus niet goed met een join blijkbaar.

Staat dus ook in het volgende artikel (tabel onderaan). Heb dus de laatste optie. Die moet dus worden aangepast. naar denk ik de 2de. Lijkt mij de handigste.

http://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

[ Voor 40% gewijzigd door Verwijderd op 14-05-2008 16:08 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 14 mei 2008 @ 15:59:
Klant is op de volgende manier gemapped in de class project.:

XML:
1
2
3
4
<any name="Klant" id-type="int" meta-type="class">
      <column name="klantType"/>
      <column name="klantNummer"/>      
</any>


Dit werkt opzich goed, alleen dus niet goed met een join blijkbaar.
Dat komt dus omdat je een Join hebt met "Klant", Maar aangezien er bij Klant geen Properties gedefineerd zijn kan je daar dus ook niet op selecteren ( of orderen ) Dat toevallig alle sub-classes van Klant wel die property hebben veranderd daar niks aan.

Als je bijvoorbeeld de Table-Per-Subclass structuur aanhoud en de naam map je bij de Klant tabel dan kan je wel doen wat jij wilt.
Staat dus ook in het volgende artikel (tabel onderaan). Volgens mij heb ik dus die laatste optie.
http://www.hibernate.org/hib_docs/reference/en/html/inheritance.html
Het gaat hier idd mis op Joins.

Je hebt dus 2 opties. Of je sorteerd in je applicatie ( List<T>.Sort(IComparer<T> ) bijvoorbeeld )of je moet een andere manier van mapping aanhouden ( Bijvoorbeeld de Table-Per-Subclass methode )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Ik gebruik zoveel joins, dus ga toch voor de table-per-subclass
Pagina: 1