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,最後一條會重複寫數據,當然就不正確了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章