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

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

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。数据操作类
UserRolePermissionFixure
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(truetrue);
        }

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

转载于:https://www.cnblogs.com/hliq/archive/2008/02/21/2087242.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【竞赛题解】Codeforces Round #715 (Div. 2) C

C. The Sports Festival 题意&#xff1a;对于给定的整型数组aaa&#xff0c;每次选择其中一个元素aia_iai​&#xff08;不能重复选择同一元素&#xff09;&#xff0c;每次计算已选择的元素的极差&#xff08;最大元素减最小元素的差&#xff09;&#xff0c;输出最后极差和…

C和汇编---sizeof运算符和strlen函数

sizeof sizeof是C语言的内置运算符&#xff0c;以字节为单位给出指定类型的大小。 程序&#xff1a; #include <stdio.h>int main(void) {int a8;int b sizeof(a);//printf("a占用字节%u\n",sizeof(a));printf("a占用字节%d\n",b);return 0; }反汇…

[原]Asp.net替换不同版本的Dll文件碰到的问题以及解决办法.

情景还原: 今天一个朋友说网站不能上传图片,我检查后发现一直卡住在上传页面,一直滚动,是个Fckeditor控件2.6.3的. 经过google以后得到的结论是图片上传成功,但是没有返回结果,在服务器上可以看到上传的图片. 说明是上传控件有问题,程序不能返回结果. 再google以后发现有人已经…

【桶】220.存在重复元素 III 【LeetCode】

220.存在重复元素 III 【LeetCode】 给你一个整数数组 nums 和两个整数 k 和 t。请你判断是否存在 两个不同下标i和j&#xff0c;使得 abs(nums[i] - nums[j]) < t&#xff0c;同时又满足 abs(i - j) < k。 如果存在则返回 true&#xff0c;不存在返回 false。 示例 1…

远控免杀专题12--Green-Hat-Suite免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

远控免杀专题 13----zirikatu免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

UML 的九种模型图

1. UML的模型图 UML 的模型图能够将被建模的系统的某一个方面的某一部分以图形的方式表示出来&#xff0c;不同的视图通过将多个不同的模型图有机组合在一起就能够描述系统模型的某方面的特征。UML的模型图是有模型元素构成的&#xff0c;模型元素以图标的形式直观形象的表达…

【莫队】区间众数(Codeforces Round #716 (Div. 2) D)

D. Cut and Stick &#xff08;赛后补题&#xff09;借本题学习莫队算法以及区间众数的求法 题意&#xff1a;对于整型数组&#xff0c;每次询问[L,R][L,R][L,R]区间问最少分为多少个子序列&#xff0c;使得每个子序列的众数xxx的个数cntxcnt_xcntx​不大于 ⌈len2⌉\left \l…

如何正确使用SqlConnection

以前曾见过有人这样写代码&#xff1a; public class Service1 : IService1{private SqlConnection conn new SqlConnection();public void Method1(){//do something with conn;}public void Method2(){//do something with conn;}public void Method3(){//do something with…

远控免杀专题 14 ---AVIator

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

【Web开发】级联查询(Ajax/ jQuery/ Servlet)

实现级联查询 共有两个下拉框&#xff0c;第一级为学院&#xff0c;第二级为学院开设的科目。 实现的功能为&#xff1a;当改变学院的选择&#xff0c;第二级下拉框需变为对应学院开设的科目内容。 结果预览&#xff1a; jsp页面 <% page contentType"text/html;…

远控免杀专题(15)-DKMC免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

SQL——以面向集合的思维方式来思考

本文来自&#xff1a;http://www.ituring.com.cn/article/details/472 为了以有趣的方式更好地帮助你形成面向集合的思维方式&#xff0c;我将给出自己最喜欢的游戏之一——集合。你可以在线玩这个游戏&#xff0c;网址是www.setgame.com/puzzle/set.htm&#xff0c;每天都会贴…

远控免杀专题(16)-Unicorn免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

【汇编语言】乘法(MUL/IMUL)

乘法&#xff08;MUL/IMUL&#xff09; 目录乘法&#xff08;MUL/IMUL&#xff09;IMUL(signed multiply)有符号数乘法MUL(unsigned multiply)无符号数乘法麻&#xff01;属实是被这个有符号乘法给整麻了&#xff0c;教材就一行例子直接不解释了&#xff0c;关于标志位溢出的一…

eclipse快捷键

Java开发工具(Eclipse的视窗和视图概述) A:视窗 每一个基本的窗体被称为视窗 PackageExplorer 显示项目结构&#xff0c;包&#xff0c;类&#xff0c;及资源Outline 显示类的结构&#xff0c;方便查找&#xff0c;识别&#xff0c;修改Console 程序运行的结果在该窗口显示Hie…

【汇编语言】除法(DIV/IDIV)

除法&#xff08;DIV/IDIV&#xff09; 目录除法&#xff08;DIV/IDIV&#xff09;DIV(unsigned divide)无符号数除法IDIV(signed divide)有符号数除法DIV(unsigned divide)无符号数除法 格式&#xff1a;DIV SRC 操作&#xff1a; SRCSRCSRC为字节时&#xff0c;(AL)←(AX)/…

远控免杀专题(17)-Python-Rootkit免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

斜视角的讨论(转)

http://school.ogdev.net/listshow.asp?page4&typeid0&categoryid5&id0&ListType2 目 录 1.1 地图和地表 1.2 斜视角游戏中的视角 1.3 Tile图片的拼接 1.4 不同地表间的过渡 1.5 地图数据结构的定义 --------------------------------------------------…

计算机网络(湖科大教书匠)

计算机网络&#xff08;湖科大教书匠&#xff09; 本文档为教学视频【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;_哔哩哔哩_bilibili】的摘录 目录计算机网络&#xff08;湖科大教书匠&#xff09;一、绪论1.2 因特网概述1.2.1 网络、互连网&#xff08;互联…