科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道nhibernate学习之三级联(Ternary Associations)篇

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

通过进一步学习Nhibernate基础知识,掌握用Nhiberate实现对级联的支持,通过一个简单的用户角色权限系统来体验nhibernate对级联的强大支持。

作者:ghost 来源:CSDN 2007年9月24日

关键字: ghost NHibernate 三级联

  • 评论
  • 分享微博
  • 分享邮件

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轻松实现级联,这相比较代码生成来说,无疑是一个优点。
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1738186

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章