nhibernate學(xué)習(xí)之三級聯(lián)(Ternary Associations)篇
園子里面的兄弟們好,由于工作和身體的原因,幾天來都沒有寫有關(guān)nhibernate學(xué)習(xí)系列了。看了看前幾篇大家的回復(fù),首先想要多謝兄弟們對小弟的關(guān)注和支持,可小弟水平有限,寫出來的也只是入門級的心得。只是有一個心愿,那就是拋磚引玉,希望能和大家更多更好的互動。技術(shù)無極限,而我更想要得是能在園子里面認(rèn)識更多的兄弟,更多的朋友。對了,忘記了一點事情,那就是,兄弟們,節(jié)日快樂,哈哈哈。。。唧唧歪歪這么多,大家不要見笑,下面進入正題
1) 學(xué)習(xí)目標(biāo)
通過進一步學(xué)習(xí)Nhibernate基礎(chǔ)知識,掌握用Nhiberate實現(xiàn)對級聯(lián)的支持,通過一個簡單的用戶角色權(quán)限系統(tǒng)來體驗nhibernate對級聯(lián)的強大支持。
2)開發(fā)環(huán)境和必要準(zhǔn)備
開發(fā)環(huán)境為:windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition
必要準(zhǔn)備:學(xué)習(xí)前三篇nhibernate學(xué)習(xí)系列Nhibernate學(xué)習(xí)之起步篇-1 ,Nhibernate學(xué)習(xí)起步之many-to-one篇 ,Nhibernate學(xué)習(xí)之many-to-many篇
3)示例
業(yè)務(wù)需求:實現(xiàn)一個用戶角色權(quán)限系統(tǒng),一個用戶只有一個角色,一個角色下有多個用戶,一個角色下有多個權(quán)限,一個權(quán)限也對應(yīng)多個角色
要求: (1).創(chuàng)建一個角色 (2)在該角色上創(chuàng)建兩個個用戶3)創(chuàng)建兩個權(quán)限4)指定該角色上的權(quán)限列表5)獲得一個用戶的權(quán)限列表
首先看關(guān)系數(shù)據(jù)庫關(guān)系圖:
4)實現(xiàn)步驟:
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。數(shù)據(jù)操作類
UserRolePermissionFixure
5。單元測試類
UnitTest1.cs
通過本篇的學(xué)習(xí),將充分理解到nhibernate對級聯(lián)支持的強大。另外除了支持三級聯(lián)之外,他還支持異類關(guān)聯(lián)(Heterogeneous Associations) .給開發(fā)帶來了更多的靈活性和實用性。而且考慮到性能的問題,還添加了lazy這樣的延遲加載的功能,加載父親不必要一定要加載他的兒子集合。通過集合類映射,nhinernate輕松實現(xiàn)級聯(lián),這相比較代碼生成來說,無疑是一個優(yōu)點。
1) 學(xué)習(xí)目標(biāo)
通過進一步學(xué)習(xí)Nhibernate基礎(chǔ)知識,掌握用Nhiberate實現(xiàn)對級聯(lián)的支持,通過一個簡單的用戶角色權(quán)限系統(tǒng)來體驗nhibernate對級聯(lián)的強大支持。
2)開發(fā)環(huán)境和必要準(zhǔn)備
開發(fā)環(huán)境為:windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition
必要準(zhǔn)備:學(xué)習(xí)前三篇nhibernate學(xué)習(xí)系列Nhibernate學(xué)習(xí)之起步篇-1 ,Nhibernate學(xué)習(xí)起步之many-to-one篇 ,Nhibernate學(xué)習(xí)之many-to-many篇
3)示例
業(yè)務(wù)需求:實現(xiàn)一個用戶角色權(quán)限系統(tǒng),一個用戶只有一個角色,一個角色下有多個用戶,一個角色下有多個權(quán)限,一個權(quán)限也對應(yīng)多個角色
要求: (1).創(chuàng)建一個角色 (2)在該角色上創(chuàng)建兩個個用戶3)創(chuàng)建兩個權(quán)限4)指定該角色上的權(quán)限列表5)獲得一個用戶的權(quán)限列表
首先看關(guān)系數(shù)據(jù)庫關(guān)系圖:
4)實現(xiàn)步驟:
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>
作者:jillzhang
出處:http://jillzhang.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
出處:http://jillzhang.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。


浙公網(wǎng)安備 33010602011771號