扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者: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; } } }}
<?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>
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; } } }}
<?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>
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; } } }}
<?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>
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(); } } }}
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); } }}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1738186
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者