NHibernate小结之四

 这次把常用的三种数据关系配置用例子给出,方便以后直接参考。

这次的配置是:SharpDevelop3.0beta, sql server 2k和nhibernate2.0GA版, 测试用的NUnit2.4.7版。

 

示例下载:

http://download.csdn.net/source/596685

 

 

新建一个项目,命名为Demo3。

加入引用,有NHiberanet.dll和Iesi.Collection.dll,测试用的nunit.framwork.dll。

还是老规则,cs文件放在Domain目录下,hbm.xml放在Mappings目录下,因为这次都是小例子,所以都是全手工写的,没有用生成工具,代码和配置文件都很简单明了。

 

One-to-One

 

 

Person和Passport,代表一个人有一本护照(或者身份证),一对一,呵呵。

 

  1.     public class Person
  2.     {
  3.         public Person()
  4.         {
  5.         }
  6.         
  7.         virtual public int ID {getset;}
  8.         virtual public int Age {getset;}
  9.         virtual public string Name {getset;}
  10.         virtual public Passport Passport {getset;}
  11.     }

 

  1. <?xml version="1.0"?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo3" namespace="Demo3.Domain">
  3.     <class name="Person">
  4.         <id name="ID">
  5.             <generator class="native"/>
  6.         </id>
  7.         <property name="Age"/>
  8.         <property name="Name"/>
  9.         <one-to-one name="Passport" class="Passport" cascade="all"/>
  10.     </class>
  11. </hibernate-mapping>

 

  1.     public class Passport
  2.     {
  3.         public Passport()
  4.         {
  5.         }
  6.         
  7.         virtual public int ID {getset;}
  8.         virtual public string Expire {get;set;}
  9.         virtual public Person Person{get;set;}
  10.     }

 

  1. <?xml version="1.0"?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo3" namespace="Demo3.Domain">
  3.     <class name="Passport">
  4.         <id name="ID">
  5.             <generator class="foreign">
  6.                 <param name="property">Person</param>
  7.             </generator>
  8.         </id>
  9.         <property name="Expire"/>
  10.         <one-to-one name="Person" class="Person" constrained="true"/>
  11.     </class>
  12. </hibernate-mapping>

 

测试代码:

 

  1.         [Test]
  2.         public void TestAdd()
  3.         {
  4.             var person = new Person();
  5.             person.Age = 25;
  6.             person.Name = "abin";
  7.             var passport = new Passport();
  8.             passport.Expire = "never";
  9.             person.Passport = passport;
  10.             passport.Person = person;
  11.             
  12.             var session = HibernateFacotry.CurrentSession();
  13.             var tran = session.BeginTransaction();
  14.             session.Save(person);
  15.             tran.Commit();
  16.         }

 

One-to-Many

 

这个例子更明了,Parent和Child,一对多。

 

  1.     public class Parent
  2.     {
  3.         public Parent()
  4.         {
  5.         }
  6.         
  7.         virtual public int ID{get;set;}
  8.         virtual public ISet<Child> Children{get;set;}
  9.     }

 

  1. <?xml version="1.0"?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo3" namespace="Demo3.Domain">
  3.     <class name="Parent">
  4.         <id name="ID">
  5.             <generator class="native"/>
  6.         </id>
  7.         <set name="Children" cascade="all" lazy="true">
  8.             <key column="parent_id"></key>
  9.             <one-to-many class="Child"/>
  10.         </set>
  11.     </class>
  12. </hibernate-mapping>

 

  1.     public class Child
  2.     {
  3.         public Child()
  4.         {
  5.         }
  6.         
  7.         virtual public int ID {getset;}
  8.         virtual public Parent Parent{get;set;}
  9.     }

 

  1. <?xml version="1.0"?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo3" namespace="Demo3.Domain">
  3.     <class name="Child">
  4.         <id name="ID">
  5.             <generator class="native"/>
  6.         </id>
  7.         <many-to-one name="Parent" column="parent_id" class="Parent"/>
  8.     </class>
  9. </hibernate-mapping>

 

Many-to-Many

 

这个例子是教科书上的经典,学生选课,Student,Lesson,和student_lesson。但配置中最后一个表是不会出现的,它只是配置表,在数据库中有,但配置里面没有。

 

  1.     public class Student
  2.     {
  3.         public Student()
  4.         {
  5.             lessons = new HashedSet<Lesson>();
  6.         }
  7.         virtual public int ID{get;set;}
  8.         virtual public ISet<Lesson> lessons{get;set;}
  9.         virtual public int age{get;set;}
  10.         virtual public string name{get;set;}
  11.     }

 

  1. <?xml version="1.0"?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo3" namespace="Demo3.Domain">
  3.     <class name="Student">
  4.         <id name="ID">
  5.             <generator class="native"/>
  6.         </id>
  7.         <property name="name"/>
  8.         <property name="age"/>
  9.         <set name="lessons" table="student_lesson" lazy="true" inverse="false" cascade="save-update">
  10.             <key column="student_id"></key>
  11.             <many-to-many class="Lesson" column="lesson_id"></many-to-many>
  12.         </set>
  13.     </class>
  14. </hibernate-mapping>

 

  1.     public class Lesson
  2.     {
  3.         public Lesson()
  4.         {
  5.             students = new HashedSet<Student>();
  6.         }
  7.         
  8.         virtual public ISet<Student> students{get;set;}
  9.         
  10.         virtual public int ID{get;set;}
  11.         virtual public string LessonName{get;set;}
  12.         
  13.     }

 

  1. <?xml version="1.0"?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo3" namespace="Demo3.Domain">
  3.     <class name="Lesson">
  4.         <id name="ID">
  5.             <generator class="native"/>
  6.         </id>
  7.         <property name="LessonName"/>
  8.         <set name="students" table="student_lesson" lazy="true" inverse="true" cascade="save-update">
  9.             <key column="lesson_id"></key>
  10.             <many-to-many class="Student" column="student_id"></many-to-many>
  11.         </set>
  12.     </class>
  13. </hibernate-mapping>

 

多对多的配置容易让人发晕,说明一下。Set里面的table指定的是配置表,Key里面的列是指在配置表里哪一列是可以确认本类的,比如这个例子里面,本类是Lesson,所以在配置表里面,lesson_id是用来确认本类数据的,而many-to-many指的是关系那边的类Student的情况,所以Student对应的列是student_id。另外一边是一样的,因为many2many是对等的。记得Key和many-to-many中的column都要写,这样生成的配置表才会正确。

 

测试一下

  1.         [Test]
  2.         public void TestMethod()
  3.         {
  4.             // TODO: Add your test.
  5.             var lesson = new Lesson();
  6.             var student = new Student();
  7.             lesson.LessonName = "math";
  8.             lesson.students.Add(student);
  9.             student.age = 14;
  10.             student.name = "afrid";
  11.             student.lessons.Add(lesson);
  12.             var session = HibernateFacotry.CurrentSession();
  13.             var tran = session.BeginTransaction();
  14.             session.Save(student);
  15.             tran.Commit();
  16.             HibernateFacotry.CloseSession();
  17.         }

 

主控方也要设置一下,主控方是inverse为false的那方。不设的话NHibernate会生成四条sql,最后一条会重复写数据,当然就不正确了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值