Toon posts:

[VB.NET] NHibernate - Mapping - One to one relaties

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hello, nog eens over NHibernate...

Ik probeer hier met VB.NET applicatie facturen naar een SQL2000 databank weg te schrijven, helaas ik slaag er niet in van 'complexe' objecten weg te schrijven. Zolang ik bij basistypes blijf (int, string, ...) gaat alles perfect. Nu mijn programma bevat een aantal facturen. Elke factuur is opgebouwd uit een aantal factuurregels. Elke factuurregel bevat een referentie naar een artikel.

Nu zou ik willen dat wanneer ik de factuurregel persisteer, ook automatisch het artikel dat het bevat wordt gepersisteerd in de tabel 'artikels'.

Nu slaag ik er niet in om de goede mapping te schrijven.

Even een beetje code pasten:

Van de Factuurregel wil ik enkel het id (automatisch) gegenereerd, en het aantal persisteren.
Automatisch zou ook het Artikel moeten worden gepersisteerd in andere tabel.

=========================================================
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Paperclip.FactuurRegel, Paperclip" table="factuurregel">
<id name="m_ID" access="field" column="FactuurRegelID" type="Int32">
<generator class="native" />
</id>


<property name="Aantal" type="Int32"/>
<one-to-one name="Paperclip.Artikel, Paperclip" class="Paperclip.Artikel, Paperclip" column="ArtikelID" not-null="true" cascade="delete"/>


</class>
</hibernate-mapping>
====================================================
Artikel
====================================================

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Paperclip.Artikel, Paperclip" table="artikels">
<id name="m_ID" access="field" column="ArtikelID" type="Int32">
<generator class="native" />
</id>
<property name="Verkoopprijs" type="Double"/>
<property name="Omschrijving" type="String" />
<property name="Groep" type="String"/>
<property name="Btwpercentage" type="Byte"/>


<<set name="FactuurRegel" >
<key column="ArtikelID" />
<one-to-one class="Paperclip.FactuurRegel, Paperclip" />
</set>


</class>
</hibernate-mapping>

===========================================================

De vraag is hoe schrijf ik de juiste mapping? Bij mijn weten hoeft het Artikel totaal niet te weten tot welke Factuurregel het behoort. De factuurregel hoeft enkel het id van het artikel te onthouden om het zo te kunnen terug vinden.... helaas ik krijg het niet aan de praat....

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 19-04 18:54
krijg je een fout of iets dergelijk ?

is het niet zo dat je cascade instelling van je associatie verkeerd staan?

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • voodoo202
  • Registratie: Januari 2002
  • Laatst online: 04-08-2025
Maar is het wel verstandig om de factuurregel op te bouwen uit een relatie naar het artikel nummer.

Als je straks over een paar jaar een kopie factuur moet afdrukken, en om wat voor reden is de omschrijving ofzo aangepast van het artikel, dan kun je dus nooit een juiste kopie afdrukken.

Ik heb op veel plaatsen gezien, dat ze de gegevens er gewoon direct inzetten, en dat zie niet zijn gerelateerd aan de artikelen tabel.

Verwijderd

Topicstarter
Als je straks over een paar jaar een kopie factuur moet afdrukken, en om wat voor reden is de omschrijving ofzo aangepast van het artikel, dan kun je dus nooit een juiste kopie afdrukken.
Ja dat weet ik, een factuur mag nooit wijzigen, maar het programma is zo gebouwd dat de artikelen nooit gewijzigd kunnen worden. De tabel 'artikels' bevat de gegevens van de artikels die op de factuur staan. De gegevens van de ''echte" artikels komen ergens anders vandaan en kunnen bijgevolg de waarden in de tabel nooit beinvloeden...

Ik begrijp gewoon niet hoe ik de juiste mapping moet schrijven....

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Heb je een datamodel gemaakt? Daar zou zichtbaar op moeten zijn dat je relatie FactuurRegel <-> Artikel niet 1-op-1 is, *-op-1, of te wel many-to-one.

Als je dan ook nog inverse="true" / "false" gebruikt op de juiste plekken zou bij het opslaan alles goed moeten gaan.
Wanneer je een object aan een set toevoegt en het zo wil opslaan moet je wel zeker weten dat de set ge-initialiseerd is, anders heeft Hibernate niet door dat de set gewijzigd is.

  • tijn
  • Registratie: Februari 2000
  • Laatst online: 22-03 21:36
Als je een echte one-to-one relatie hebt zullen de primary keys in de tabellen van Factuurregel en Artikel gelijk moeten zijn, In jouw geval wordt voor beide een uniek Id gegenereerd.

De beste oplossing voor als de classes apart moeten worden opgeslagen is waarschijnlijk om toch in Artikel ook een one-to-one naar Factuurregel op te nemen. Op deze manier wordt de primary key van Factuurregel ook in Artikel gebruikt. De mapping van Artikel wordt dan iets als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="Paperclip.Artikel, Paperclip" table="artikels">
  <id name="m_ID" access="field" column="ArtikelID" type="Int32">
     <generator class="foreign">
        <param name="property">FactuurRegel</param>
     </generator>
  </id>

  <property name="Verkoopprijs" type="Double"/>
  <property name="Omschrijving" type="String" />
  <property name="Groep" type="String"/>
  <property name="Btwpercentage" type="Byte"/>

   <one-to-one name="FactuurRegel" class="Paperclip.FactuurRegel, Paperclip" constrained="true" />

</class>
</hibernate-mapping>


Vergeet dan niet om autonummer van ArtikelID af te halen, of beter nog, hernoem ArtikelID naar FactuurRegelID.

Overigens lijkt het me echter wel verstandiger om alles in 1 factuurregel tabel op te slaan met 1 factuurregel class. Er zwerft vast ook nog een andere Artikel class in je systeem (voor de actuele artikelen) en dit gaat verwarring opleveren.

[ Voor 17% gewijzigd door tijn op 06-01-2006 11:39 ]

Cuyahoga .NET website framework


Verwijderd

Topicstarter
Even mijn databank tabellen posten:


tabel factuurregels:

FactuurRegelID, Int, Primary key, not null
Aantal, int
ArtikelId, int

tabel artikels:

ArtikelID, int, primary key, not null
Verkoopprijs, real
Omschrijving, nvarchar
Groep, nvarchar,
Brtwpercentage, tinyint

De vraag is wat moet nu waar, want voor mij is alles 1 grote fuzzy boel aan het worden. Hoe meer ik er naar kijk, hoe minder ik er nog duidelijkheid in zie...

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
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
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
  <class name="Paperclip.FactuurRegel, Paperclip" table="factuurregel">
    <id name="m_ID" access="field" column="FactuurRegelID" type="Int32">
      <generator class="native" />
    </id>

    <property name="Aantal" type="Int32"/>
    <many-to-one name="Artikel" class="Paperclip.Artikel, Paperclip" />
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
  <class name="Paperclip.Artikel, Paperclip" table="artikels">
    <id name="m_ID" access="field" column="ArtikelID" type="Int32">
      <generator class="native" />
    </id>

    <property name="Verkoopprijs" type="Double"/>
    <property name="Omschrijving" type="String" />
    <property name="Groep" type="String"/>
    <property name="Btwpercentage" type="Byte"/>

    <set name="FactuurRegel" >
      <key column="ArtikelID" />
      <one-to-many class="Paperclip.FactuurRegel, Paperclip" />
    </set>

</class>
</hibernate-mapping>


BTW percentages kunnen ook 17,5 zijn, dus daar een int voor gebruiken lijkt me niet handig. :)

[ Voor 30% gewijzigd door Gert op 06-01-2006 14:32 ]


Verwijderd

Topicstarter
Maar aan mijn databank tabellen is niet direct iets mis?

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Voor deze twee objecten niet. Maar ik mis wel een link met een Factuur oid maar dat is jouw zaak. :p

Verwijderd

Topicstarter
ja,

Een factuur bevat een aantal factuurregels. Dus hier krijg je dan een 1 op veel relatie. Dat is nog een ander probleem :s

Maar ik probeer stap voor stap te werken....
Pagina: 1