nhibernate学习之三级联(Ternary Associations)篇

1) 学习目标
通过进一步学习Nhibernate基础知识,掌握用Nhiberate实现对级联的支持,通过一个简单的用户角色权限系统来体验nhibernate对级联的强大支持。
 
2)开发环境和必要准备 
  开发环境为:windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition
 

3)示例
  业务需求:实现一个用户角色权限系统,一个用户只有一个角色,一个角色下有多个用户,一个角色下有多个权限,一个权限也对应多个角色
                      要求: (1).创建一个角色 (2)在该角色上创建两个个用户3)创建两个权限4)指定该角色上的权限列表5)获得一个用户的权限列表
  首先看关系数据库关系图:
  
4)实现步骤:
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 Role _role;
        /**//// <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;
            }
        }
        public virtual Role Role
        {
            get
            {
                return _role;
            }
            set
            {
                _role = value;
            }
        }
    }
}
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>
    <many-to-one name="Role"  class="NhibernateSample1.Role,NhibernateSample1" column="RoleID"></many-to-one>
   </class>
</hibernate-mapping>

2.Role.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace NhibernateSample1
{
    public class Role
    {
        int _roleID;
        string _roleName;
        IList _list = new  ArrayList();
        IList _permissionList = new ArrayList();
        public virtual IList PermissionList
        {
            get
            {
                return _permissionList;
            }
            set
            {
                _permissionList = value;
            }
        }
        public virtual int RoleID
        {
            get
            {
                return _roleID;
            }
            set
            {
                _roleID = value;
            }
        }
        public virtual IList UserList
        {
            get
            {
                return _list;
            }
            set
            {
                _list = value;
            }
        }
        public virtual string RoleName
        {
            get
            {
                return _roleName;
            }
            set
            {
                _roleName = value;
            }
        }
    }
}


Role.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="NhibernateSample1.Role,NhibernateSample1" table="Roles" lazy="false">
    <id name="RoleID" column="RoleID" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="RoleName"  column="RoleName"  type="string" length="64" not-null="true"></property>
    <bag name="PermissionList" table="Role_Permissions" inverse="true" lazy="false" cascade="all">
      <key column="RoleID"/>
      <many-to-many class="NhibernateSample1.Permission,NhibernateSample1" column="PermissionID"></many-to-many>
    </bag>
    <bag name="UserList" table="Users" inverse="true" lazy="false" cascade="all">
      <key column="RoleID"/>
      <one-to-many class="NhibernateSample1.User,NhibernateSample1"></one-to-many>
    </bag>
  </class>
</hibernate-mapping>

3.Permission.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace NhibernateSample1
{
    public class Permission
    {
        int _permissionID;
        string _permissionName;
        IList _roleList = new ArrayList();
        public virtual int PermissionID
        {
            get
            {
                return _permissionID;
            }
            set
            {
                _permissionID = value;
            }
        }
        public virtual string PermissionName
        {
            get
            {
                return _permissionName;
            }
            set
            {
                _permissionName=value;
            }
        }
        public virtual IList RoleList
        {
            get
            {
                return _roleList;
            }
            set
            {
                _roleList = value;
            }
        }
    }
}


Permission.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="NhibernateSample1.Permission,NhibernateSample1" table="Permissions" lazy="false">
    <id name="PermissionID" column="PermissionID" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="PermissionName" column="PermissionName" type="string" length="64" not-null="true" unique="true"></property>
    <bag name="RoleList" table="Role_Permissions"  lazy="true">
      <key column="PermissionID"/>
      <many-to-many class="NhibernateSample1.Role,NhibernateSample1" column="RoleID"></many-to-many>
    </bag>
  </class>
</hibernate-mapping>

4。数据操作类
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 UserRolePermissionFixure
    {
        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 Role CreateRole(string roleName)
        {
            Role r = new Role();
            r.RoleName = roleName;
            ISession session = _sessions.OpenSession();            
            ITransaction tx = null;
            try
            {
                tx = session.BeginTransaction();
                session.Save(r);
                tx.Commit();
            }
            catch(Exception e)
            {
                if (tx != null) tx.Rollback();
                throw e;
            }
            finally
            {
                session.Close();
            }
            return r;

        }

        public User CreateUser(String name,string pwd,Role r)
        {
            User u = new User();
            u.Name = name;
            u.Pwd = pwd;
            u.Role = r;
            //r.UserList.Add(u);
            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 Permission CreatePermission(Role r,string name)
        {
            Permission p = new Permission();
            p.PermissionName = name;
            r.PermissionList.Add(p);
            p.RoleList.Add(r);
            ISession session = _sessions.OpenSession();
            ITransaction tx = null;

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

    }
}


5。单元测试类
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.UserRolePermissionFixure usf = new UserRolePermissionFixure();
        其他测试属性#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();
            Role r = usf.CreateRole("test");
            Assert.IsTrue(r.RoleID > 0);
            User u = usf.CreateUser(Guid.NewGuid().ToString(), "ds", r);            
            Assert.IsTrue(u.Id > 0);
            Permission p = usf.CreatePermission(r, "查询");
            Assert.IsTrue(p.PermissionID > 0);         
        }

    }
}


   通过本篇的学习,将充分理解到nhibernate对级联支持的强大。另外除了支持三级联之外,他还支持异类关联(Heterogeneous Associations) .给开发带来了更多的灵活性和实用性。而且考虑到性能的问题,还添加了lazy这样的延迟加载的功能,加载父亲不必要一定要加载他的儿子集合。通过集合类映射,nhinernate轻松实现级联,这相比较代码生成来说,无疑是一个优点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值