延迟加载在NH里面分为一对一和一对多,Hibernate3中有对列的延迟,但NH目前还没有(2.0版)。
延迟的实现主要在于设置。
原理在http://www.hibernate.org/162.html说的比较清楚。
一对一
主动方的<one-to-one... constrain="true">,被动方的<class ..lazy="true">(或者不用设置,因为这是默认的),这样设置即可。
多对多
主动方的<one-to-many... lazy="true" out-joint="auto">外连接一定不能设为true,否则就会一个select取回数据了。被动方的<class ..lazy="true">(或者不用设置,因为这是默认的)。
给个一对一的例子,是上一小节中的Person和Passport,这回的延迟加载的了
- <?xml version="1.0"?>
- <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo3" namespace="Demo3.Domain">
- <class name="Person">
- <id name="ID">
- <generator class="native"/>
- </id>
- <property name="Age"/>
- <property name="Name"/>
- <one-to-one name="Passport" class="Passport" constrained="true" cascade="all"/>
- </class>
- </hibernate-mapping>
- <?xml version="1.0"?>
- <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo3" namespace="Demo3.Domain">
- <class name="Passport">
- <id name="ID">
- <generator class="foreign">
- <param name="property">Person</param>
- </generator>
- </id>
- <property name="Expire"/>
- <one-to-one name="Person" class="Person"/>
- </class>
- </hibernate-mapping>
测试代码
- [Test]
- public void TestRetrieve()
- {
- var session = HibernateFacotry.CurrentSession();
- var l = session.CreateCriteria(typeof(Person)).List();
- var p = l[0] as Person;
- Console.WriteLine("the passport now is ============");
- Console.WriteLine(p.Passport.GetType());
- Console.WriteLine("now load the real object ============");
- Console.WriteLine(p.Passport.Expire);
- }
多对多的延迟上小节中Parent和Child配置已经是的了,就不再列出来了。