[nhibernate (2.0)] Config. .hbm files meerdere namespaces

Pagina: 1
Acties:

Onderwerpen


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 22:44
Goeiedag,

Ik ben bezig met een Outlook plugin van waaruit nhibernate gebruikt moet gaan worden. Ik ben nog bezig met de configuratie, en daar kom ik niet uit. De nhibernate configuratie gaat goed, maar de table definities (.hbm.xml) pakt hij niet.

Het is zo dat mijn Outlook plugin een andere namespace gebruikt dan die waar mijn persistence classes in staan. Uiteraard heb ik een reference naar die andere namespace. In dat betreffende project zitten de classes en zitten ook de .hbm.xml files, die ik uiteraard gedefinieerd heb als "embedded resource". Voor de zekerheid heb ik die .hbm.xml files ook nog in mijn Outlook plugin project gestopt en ook daar gedefinieerd als "embedded resource" en voor de zekerheid kopieert hij ze ook mee naar de output directory.

Desondanks krijg ik de volgende foutmelding:
{"De objectverwijzing is niet op een exemplaar van een object ingesteld."}
De regel waar dit op foutloopt vind je hieronder, en mijn tabelnaam is inderdaad ObjectNo (ik heb dat ook niet bedacht :P).
C#:
1
IQuery query = currentSession.CreateQuery("FROM ObjectNo");


Ik heb de documentatie al doorgespit, en de voorbeelden bekeken, maar ten eerste is voor deze 2.0 weinig documentatie beschikbaar en wat er is gaat meestal over simpele voorbeelden.

Hier nog even mijn configuratie-code:
C#:
1
2
3
4
NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration();
configuration.AddXmlFile("ObjectNo.hbm.xml");
sessionFactory = configuration.Configure().BuildSessionFactory();
currentSession = sessionFactory.OpenSession();

Wie weet hoe ik dit werkend krijg? Alvast bedankt! :).

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:30
Ben je zeker dat het iets met je hbm.xml files te maken heeft ? Wat is de exacte exceptie die je krijgt ?
Die exceptie die je geeft, duidt gewoon op een null-reference exception. Is je currentSession variable NULL ?

Wat ik meestal doe, in m'n NHibernate configuratie, is in de App.Config file aangeven in welke assembly NHibernate de mapping files vind. (mapping-assembly element).

https://fgheysels.github.io/


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 22:44
whoami schreef op woensdag 17 september 2008 @ 12:29:
Ben je zeker dat het iets met je hbm.xml files te maken heeft ?
Niet 100% 8)7.

Je opmerking over currentSession sloeg in als een bom. Ik had het getest en toen werkte het, en later pas de AddXmlFile toegevoegd aan de configuratie. Daarna heb ik dat gedeelte niet meer getest (try/catch) maar dat werkte dus geheel niet meer.

Kortom, daar nog even naar gekeken. Niets lukte! Hij verwerkte mijn xml file niet. Toen uiteindelijk het AddXmlFile vervangen door AddAssembly, wat in essentie ook beter is (ik ga niet alle xml files één voor één toevoegen :o).

Toen kreeg ik nogsteeds een foutmelding, maar werd het wel duidelijk op Google. Assembly-attribuut toegevoegd aan de .xml file (die meegecompileerd wordt in mijn assembly) en toen werkte het! Jeej!

Kortom, ik zat volledig op het verkeerde spoor maar dankzij jouw tip kwam ik weer goed terecht. Stom natuurlijk dat ik er vanuit ging dat het daarboven goed werkte (had m'n breakpoint al weggehaald).

Dan ga ik nu lekker spelen met mijn plugin. Bedankt whoami! :).

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 22:44
Ik kaap mijn eigen topic nog even voor iets vergelijkbaars anders :).

Ik heb nu alles aan de praat en heb inmiddels ook al succesvol een query opgehaald. Meteen daarna ben ik gaan stoeien met de lastigste case, namelijk een tabel die geen unieke identifier heeft. En dus gaan werken met een composite key.

Ik heb de documentatie goed gelezen en vervolgens het .hbm.xml bestand aangemaakt:
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" namespace="Waterproef.DataObjects" assembly="Waterproef.DataObjects">
    <class name="WP_Config" table="WP_Config">
        <composite-id>
            <key-property name="Environment" column="environment" type="String"/>
            <key-property name="ConfigClass" column="environment" type="String"/>
            <key-property name="Variable" column="environment" type="String"/>
        </composite-id>
        <property name="Value" column="value" type="String"/>
        <property name="ValueType" column="valuetype" type="Int32"/>
        <property name="ModificationDate" column="modificationdate" type="DateTime"/>
        <property name="LastUsedDate" column="lastuseddate" type="DateTime"/>
    </class>
</hibernate-mapping>

Naast de documentatie had ik nog wat meer voorbeelden gevonden waaruit bleek dat dit de juiste methode is.

In de documentatie staat duidelijk
Your persistent class must override Equals() and GetHashCode() to implement composite identifier equality. It must also be Serializable.
en dat heb ik opgevolgd. Dat heeft het volgende opgeleverd:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public override bool Equals(object obj)
        {
            try
            {
                WP_Config config = (WP_Config)obj;
                return (this.GetHashCode() == config.GetHashCode());
            }
            catch (InvalidCastException)
            {
                return false;
            }
        }

        public override int GetHashCode()
        {
            return (GetType() + "|" + Environment + "|" + ConfigClass + "|" + Variable).GetHashCode();
        }

Het lijkt mij dat dit altijd een uniek id oplevert, maar toch krijg ik de volgende fout:
{"More than one row with the given identifier was found: Waterproef.DataObjects.WP_Config, for class: Waterproef.DataObjects.WP_Config"}
en dat is voor de volgende code:
C#:
1
2
3
4
5
6
                IQuery query = currentSession.CreateQuery("FROM WP_Config");
                IEnumerable objects = query.Enumerable();
                foreach (WP_Config obj in objects)
                {
                    logger.Info(obj.Value);
                }

Uiteraard heb ik het serializable attribuut toegevoegd aan de klasse, dus dat is het ook niet. Zoeken op internet is lastig omdat voor versie 2.0 specifiek weinig informatie voorhanden is.

Wie heeft er een idee?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:30
Eh, ja, Ik zie niet in waarom jij zou denken dat het Serializeable attribuut hier iets zou uitmaken voor dit probleem.

Volgens mij zal je de fout moeten zoeken in je gethashcode override ...
(is het trouwens niet beter / makkelijker als je een aparte class maakt die je gebruikt voor het voorstellen van je composite id ?
nb:
je kan je Equals method veel efficienter maken door niet zowiezo te gaan casten, en dan gewoon false te returnen als het casten mislukt (en je object dus van een ander type is). Je kan hier beter de as operator voor gebruiken.

https://fgheysels.github.io/


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 22:44
whoami schreef op donderdag 18 september 2008 @ 10:35:
Eh, ja, Ik zie niet in waarom jij zou denken dat het Serializeable attribuut hier iets zou uitmaken voor dit probleem.
Ik ook niet, maar het staat in de documentatie, dus ik dacht: ik zeg het maar even voordat iemand anders het zegt :P.
Volgens mij zal je de fout moeten zoeken in je gethashcode override ...
(is het trouwens niet beter / makkelijker als je een aparte class maakt die je gebruikt voor het voorstellen van je composite id ?
Dat laatste begrijp ik niet. Daarnaast zou het op deze manier gewoon goed moeten werken. De override lijkt mij ook prima. Met de getoonde drie variabelen moet toch altijd een unieke combinatie verschijnen. Ik kan natuurlijk ook een gethashcode maken met een random getal en de eerste keer daar een interne int mee vullen. Bij een tweede keer opvragen ziet hij dan datzelfde getal. Ik weet niet of het erg fail-proof is :+.
je kan je Equals method veel efficienter maken door niet zowiezo te gaan casten, en dan gewoon false te returnen als het casten mislukt (en je object dus van een ander type is). Je kan hier beter de as operator voor gebruiken.
Hmmm, ik ken die oplossing niet maar volgens mij kwam ik vanochtend ergens op internet iets vergelijkbaars tegen. Ik ga daar even mee stoeien.

Acties:
  • 0 Henk 'm!

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 22:44
Weet iemand nog hoe ik ervoor kan zorgen dat mijn Equals en GetHashCode functie gewoon goed werken, waarbij NHibernate dus geen dubbele objecten krijgt?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:30
Daar zijn heel wat artikels over te vinden op Internet.
Moet je eens zoeken op 'don't let nhibernate steal your identity'

klik
klik

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Beetje offtopic, maar...
"De objectverwijzing is niet op een exemplaar van een object ingesteld."
...zet die Nederlandse foutmeldingen 's uit?

"Object reference not set to an instance of an object" Googlet een stuk beter!

  • Forcepoint
  • Registratie: Januari 2007
  • Laatst online: 11-09 09:31
Verwijderd schreef op dinsdag 23 september 2008 @ 18:38:
Beetje offtopic, maar...

[...]

...zet die Nederlandse foutmeldingen 's uit?

"Object reference not set to an instance of an object" Googlet een stuk beter!
Hoe doe je dit? Ik wil ze ook in het Engels (zonder teveel moeite :P ) maar voor zover ik weet kan je de exceptions alleen in een andere taal krijgen door het Framework te (her)installeren in die taal...
Pagina: 1