Ben wat aan het experimenteren met NHibernate om te kijken hoe ik een order inclusief orderregels kan saven in de database. Ik heb hiervoor in MS-SQL een ultiem simpel database-schema gemaakt:

Tabel Orders
- ID is PK en een identity veld
- Reference is een nvarchar(50) met de order beschrijving
Tabel OrderLines
- ID is PK en een identity veld
- OrderID is de FK die verwijst naar Orders.ID (Orders->OrderLines is een 1:N relatie)
- Linenumber bepaalt de volgorde van de orderregels
- Description is een nvarchar(50) met de beschrijving van de regel
Vervolgens heb ik de Order en OrderLine entity classes gemaakt met onderstaande hibernate mappings:
Order.hbm.xml
Orderline.hbm.xml
Ik wil nu een order met 2 orderregels in de database toevoegen. Dit doe ik als volgt:
Ik zie nu dat een order wordt aangemaakt in de tabel Orders, maar de tabel OrderLines wordt niet gevuld. De cascade="all" in de mapping files zou hier echter wel voor moeten zorgen. In de log zie ik het volgende terug:
In de laatste regels zie ik inderdaad Ik zie hier inderdaad "processing cascades for: NHibernateTest.Order", maar dan meteen een "done processing cascades for: NHibernateTest.Order" zonder dat er een INSERT is gedaan.
Iemand enig idee wat ik fout doe?

Tabel Orders
- ID is PK en een identity veld
- Reference is een nvarchar(50) met de order beschrijving
Tabel OrderLines
- ID is PK en een identity veld
- OrderID is de FK die verwijst naar Orders.ID (Orders->OrderLines is een 1:N relatie)
- Linenumber bepaalt de volgorde van de orderregels
- Description is een nvarchar(50) met de beschrijving van de regel
Vervolgens heb ik de Order en OrderLine entity classes gemaakt met onderstaande hibernate mappings:
Order.hbm.xml
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.0"> <class name="NHibernateTest.Order, NHibernateTest" table="Orders"> <id name="Id" column="ID" type="Int32" unsaved-value="0"> <generator class="identity" /> </id> <property name="Reference" column="Reference" type="String(50)" /> <list name="Orderlines" inverse="true" cascade="all"> <key column="OrderID" /> <index column="Linenumber"/> <one-to-many class="NHibernateTest.Orderline, NHibernateTest" /> </list> </class> </hibernate-mapping> |
Orderline.hbm.xml
XML:
1
2
3
4
5
6
7
8
9
10
11
12
| <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"> <class name="NHibernateTest.Orderline, NHibernateTest" table="Orderlines"> <id name="Id" column="ID" type="Int32" unsaved-value="0"> <generator class="identity" /> </id> <property name="Linenumber" column="Linenumber" type="Int32" /> <property name="Description" column="Description" type="String(50)" /> <many-to-one name="Order" class="NHibernateTest.Order, NHibernateTest" cascade="all" column="OrderID" not-null="true" /> </class> </hibernate-mapping> |
Ik wil nu een order met 2 orderregels in de database toevoegen. Dit doe ik als volgt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| // Maak order en 2 orderregels Order o = new Order(); o.Reference = DateTime.Now.ToString(); Orderline line1 = new Orderline(); line1.Order = o; line1.Linenumber = 0; line1.Description = "Regel 1"; o.Orderlines.Add(line1); Orderline line2 = new Orderline(); line1.Order = o; line1.Linenumber = 1; line1.Description = "Regel 1"; o.Orderlines.Add(line2); // Save de order inclusief regels ISession session = _factory.OpenSession()) session.Save(o); session.Flush(); session.Close(); |
Ik zie nu dat een order wordt aangemaakt in de tabel Orders, maar de tabel OrderLines wordt niet gevuld. De cascade="all" in de mapping files zou hier echter wel voor moeten zorgen. In de log zie ik het volgende terug:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.SQL [(null)] - INSERT INTO Orders (Reference) VALUES (@p0); select SCOPE_IDENTITY() 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.SQL [(null)] - @p0 = '11-11-2006 22:26:01' 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.Connection.DriverConnectionProvider [(null)] - Obtaining IDbConnection from Driver 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Opened Reader, open Readers :1 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.Persister.AbstractEntityPersister [(null)] - Natively generated identity: 19 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.Driver.NHybridDataReader [(null)] - running NHybridDataReader.Dispose() 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed Reader, open Readers :0 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.Impl.BatcherImpl [(null)] - Closed IDbCommand, open IDbCommands :0 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.Engine.Cascades [(null)] - processing cascades for: NHibernateTest.Order 2006-11-11 22:26:04,823 [3544] DEBUG NHibernate.Engine.Cascades [(null)] - cascading to collection: NHibernateTest.Order.Orderlines 2006-11-11 22:26:04,833 [3544] DEBUG NHibernate.Engine.Cascades [(null)] - done processing cascades for: NHibernateTest.Order 2006-11-11 22:26:04,833 [3544] DEBUG NHibernate.Impl.SessionImpl [(null)] - flushing session |
In de laatste regels zie ik inderdaad Ik zie hier inderdaad "processing cascades for: NHibernateTest.Order", maar dan meteen een "done processing cascades for: NHibernateTest.Order" zonder dat er een INSERT is gedaan.
Iemand enig idee wat ik fout doe?
It’s nice to be important but it’s more important to be nice