nhibernate学习之三级联(Ternary Associations)篇
来源:互联网 发布:手机淘宝好评率查询 编辑:程序博客网 时间:2024/05/31 11:03
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; } } }}
<?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轻松实现级联,这相比较代码生成来说,无疑是一个优点。
- nhibernate学习之三级联(Ternary Associations)篇
- nhibernate学习之三级联(Ternary Associations)篇
- nhibernate学习之三级联(Ternary Associations)篇
- Nhibernate学习之起步篇
- Nhibernate学习之起步篇
- NHibernate小结之三
- Nhibernate学习之起步篇-1
- Nhibernate学习之many-to-many篇
- Nhibernate学习之起步篇-1
- Nhibernate学习之many-to-many篇
- Nhibernate学习之起步篇-1
- Nhibernate学习之many-to-many篇
- Nhibernate学习之起步篇-1
- NHibernate学习之旅
- NHibernate学习之-配置
- 跟NHibernate之夏一起学习NHibernate
- ajax 学习笔记之三 级联的操作
- NHibernate 级联问题
- C# 常用排序方法 冒泡排序,直接选择排序,直接插入排序
- 数据分析和数据挖掘时代来临
- 专家门诊——JSP开发答疑200问
- javaBean的应用(自己学习用)
- 数据挖掘之牛人理解
- nhibernate学习之三级联(Ternary Associations)篇
- JFace的本地化及安装JFace语言包
- 第四章的学习记录
- AJAX实现基于WEB的文件上传的进度控制
- Eclipse+MyEclipse的配置
- 真实·荒诞
- 成功领导者的感悟之言
- 黑客/病毒群体行为和产业链分析
- 销售人员解决窜货问题步骤与方法