Nhibernate学习之many-to-many篇

  1. 学习目的:

通过进一步学习Nhibernate基础知识,掌握用Nhiberate实现多对多的业务逻辑

  1. 开发环境+必要准备

  开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition

      前期准备: 学习上两篇单表操作many-to-one篇
 

3.对上篇文章的部分解释

 1)bag节点:用于定义System.Collection.IList类型的集合元素。

属性

用法

举例

name

映射的属性(必须)

name=”SalaryList”

table

映射的数据表(可选)table=”Salary”
lazy延迟加载(可选)Lazy=true|false
cascade指示级联操作方式(可选)Cascade=all
inverse关联由谁负责维护Inverse=”true”

当lazy=”true”,父类初始化的时候不会自动加载子类集合

 Cascade为级联操作方式,包括: 

属性用法说明
none默认值,不进行级联操作
save-updatesave和update级联
delete删除级联
delete-orphan删除不相关的父对象的子对象
allsave/update/delete级联
all-delete-orphanall+delete-arphan
   当inverse=”true”的时候代表由子类维护级联关系。这时候如果只往父类中添加子类,但不设定子类的父类,是不能保存子类的

 4.多对多业务模型

    还是用户系统,1个用户职员隶属于多个部门,同时1个部门有多个不同的职员 
    用户和部门之间的数据关系图为:

5.  实现步骤:
1)User.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace NhibernateSample1
{
    public class User
    {
        private int _id;
        private string _name;
        private string _pwd;
        private System.Collections.IList _departmentsList;
        /** <summary>
        /// 编号
        /// </summary>
        public virtual int Id
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
            }
        }
        /** <summary>
        /// 名称
        /// </summary>
        public virtual string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }
        /** <summary>
        /// 密码
        /// </summary>
        public virtual string Pwd
        {
            get
            {
                return _pwd;
            }
            set
            {
                _pwd = value;
            }
        }
        /** <summary>
        /// 工资列表
        /// </summary>
        public System.Collections.IList DepartmentsList
        {
            get
            {
                return _departmentsList;
            }
            set
            {
                _departmentsList = value;
            }
        }
    }
}

2)User.hbm.xml <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="NhibernateSample1.User,NhibernateSample1" table="Users" lazy="false">
    <id name="Id" column="Id" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Name" column="Name" type="string" length="64" not-null="true" unique="true"></property>
    <property name="Pwd"  column="Pwd"  type="string" length="64" not-null="true"></property>
    <bag name="DepartmentsList" table="Users_Departments" inverse="true" lazy="false" cascade="all">
      <key column="Id"/>
      <many-to-many class="NhibernateSample1.Departments,NhibernateSample1" column="DepID"></many-to-many>
    </bag>
  </class>
</hibernate-mapping>

3) Departments.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace NhibernateSample1
{
    public class Departments
    {
        int _depID;
        string _name;
        IList _usersList= new ArrayList();
        public virtual int DepID
        {
            get
            {
                return _depID;
            }
            set
            {
                _depID = value;
            }
        }
        public virtual string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }
        public virtual IList UsersList
        {
            get
            {
                return _usersList;
            }
            set
            {
                _usersList = value;
            }
        }
    }
}

4) Departments.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="NhibernateSample1.Departments,NhibernateSample1" table="Departments" lazy="false">
    <id name="DepID" column="DepID" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Name" column="Name" type="string" length="64" not-null="true" unique="true"></property>  
    <bag name="UsersList" table="Users_Departments"  lazy="true" >
      <key column="DepID"/>
      <many-to-many class="NhibernateSample1.User,NhibernateSample1" column="Id"></many-to-many>
    </bag>
  </class>
</hibernate-mapping>

5) 数据操作类 

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;

namespace NhibernateSample1
{
    public  class UserDepartmentFixure
    {
        private ISessionFactory _sessions;
        public void Configure()
        {
            Configuration cfg = GetConfiguration();     
            _sessions = cfg.BuildSessionFactory();
        }
        Configuration GetConfiguration()
        {
            string cfgPath = @"E:/my project/nhibernate study/simle 1/NHibernateStudy1/NhibernateSample1/hibernate.cfg.xml";
            Configuration cfg = new Configuration().Configure(cfgPath);
            return cfg;
        }
        public void ExportTables()
        {
            Configuration cfg = GetConfiguration();          
            new SchemaExport(cfg).Create(true, true);
        }
        public User CreateUser(String name,string pwd)
        {
            User u = new User();
            u.Name = name;
            u.Pwd = pwd;
            u.DepartmentsList = new ArrayList();

            ISession session = _sessions.OpenSession();

            ITransaction tx = null;

            try
            {
                tx = session.BeginTransaction();
                session.Save(u);
                tx.Commit();
            }
            catch (HibernateException e)
            {
                if (tx != null) tx.Rollback();
                throw e;
            }
            finally
            {
                session.Close();
            }

            return u;
        }
        public Departments CreateDepartments(User u, string name)
        {
            Departments item = new Departments();
            item.Name=name;
            u.DepartmentsList.Add(item);
            item.UsersList.Add(u);
            ISession session = _sessions.OpenSession();
            ITransaction tx = null;

            try
            {
                tx = session.BeginTransaction();
                session.Save(item);
                tx.Commit();
            }
            catch (HibernateException e)
            {
                if (tx != null) tx.Rollback();
                throw e;
            }
            finally
            {
                session.Close();
            }
            return item;
        }      
        public Departments GetDepartments(int depID)
        {
            ISession session = _sessions.OpenSession();
            ITransaction tx = null;
            try
            {
                tx = session.BeginTransaction();
                Departments item = (Departments)session.Load(typeof(Departments),
                    depID);              
                tx.Commit();
                return item;
            }
            catch (HibernateException e)
            {
                if (tx != null) tx.Rollback();
                return null;
            }
            finally
            {
                session.Close();
            }
            return null;
        }
        public User GetUser(int uid)
        {
            ISession session = _sessions.OpenSession();
            ITransaction tx = null;
            try
            {
                tx = session.BeginTransaction();
                User item = (User)session.Load(typeof(User),
                    uid);
                tx.Commit();
                return item;
            }
            catch (HibernateException e)
            {
                if (tx != null) tx.Rollback();
                return null;
            }
            finally
            {
                session.Close();
            }
            return null;
        }      

        public void Delete(int uid)
        {
            ISession session = _sessions.OpenSession();
            ITransaction tx = null;
            try
            {
                tx = session.BeginTransaction();
                Departments item = session.Load(typeof(Departments), uid) as Departments;
                session.Delete(item);
                tx.Commit();
            }
            catch (HibernateException e)
            {
                if (tx != null) tx.Rollback();
                throw e;
            }
            finally
            {
                session.Close();
            }
        }

    }
}

6)单元测试类

using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NhibernateSample1;

namespace TestProject1
{
    /** <summary>
    /// UnitTest1 的摘要说明
    /// </summary>
    [TestClass]
    public class UnitTest1
    {
        public UnitTest1()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
        NhibernateSample1.UserDepartmentFixure usf = new UserDepartmentFixure();
        其他测试属性#region 其他测试属性
        //
        // 您可以在编写测试时使用下列其他属性:
        //
        // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // 在运行每个测试之前使用 TestInitialize 运行代码
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // 在运行每个测试之后使用 TestCleanup 运行代码
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void Test1()
        {
            usf.Configure();
            usf.ExportTables();
            User u = usf.CreateUser(Guid.NewGuid().ToString(), "ds");
            Assert.IsTrue(u.Id>0);
            Departments s = usf.CreateDepartments(u, "政治部");
            Assert.IsTrue(s.DepID > 0);
            Departments s1 = usf.CreateDepartments(u, "事业部");
            Assert.IsTrue(s1.DepID > 0);        
            usf.Delete(s1.DepID);
            s1 = usf.GetDepartments(s1.DepID);
            Assert.IsNull(s1);
            User u1 = usf.GetUser(1);
            Assert.IsTrue(u1.DepartmentsList.Count>0);
        }

    }
}
到现在为止,终于更加体会到nhibernate的强大了。继续努力,fight! 

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值