• NHibernate开源框架Cuyahoga学习之权限映射


    代码
    在Cuyahoga项目中,NHibernate中关联关系在权限中得到了很好的体现。
    User用户
    Role角色:比如管理员,会员,游客等
    Right权限:比如文章的增,删,改
    Site站点 
    项目中的三者之间的关系是:
    User:Role 关系:多对多单项关联. 多个用户对应一个角色。
    Role:Right关系: 多对多单项关联. 多个角色对应一个权限。
    Role:Site关系:多对多双向关联
       多对多时,采用关联表的策略,此时两个配置文件中
    key和many
    -to-many都必须指定column属性,key和many-to-many分别指定本持久化类,
    关联类在连接表中的外键列名,因此两边的key与many
    -to-many的column属性交叉相同。
    -------------------------------------
    下面是实体类和配置文件。
    1.实体类User以及hbm.xml配置文件代码:
    User实体类
            
    public class User 
        {
            
    private int _id;
            
    private string _userName;
            
    private string _password;
            
    private IList<Role> _roles;
            
    private IList<Right> _rights;
            
    #region properties
            
            
    public virtual int Id
            {
                
    get { return this._id; }
                
    set { this._id = value; }
            }
            [ValidateNonEmpty(
    "UserNameValidatorNonEmpty")]
            [ValidateLength(
    150"UserNameValidatorLength")]
                    
    public virtual string UserName
                    {
                        
    get { return this._userName; }
                        
    set { this._userName = value; }
                    }
            [ValidateNonEmpty(
    "PasswordValidatorNonEmpty")]
            [ValidateLength(
    550"PasswordValidatorLength")]
            
    public virtual string Password
            {
                
    get { return this._password; }
                
    set { this._password = value; }
            }
            [ValidateCollectionNotEmpty(
    "RolesValidatorNotEmpty")]
            
    public virtual IList<Role> Roles
            {
                
    get { return this._roles; }
                
    set { this._roles = value; }
            }
            
    public virtual IList<Right> Rights
            {
                
    get
                {
                    
    if (this._rights == null)
                    {
                        
    this._rights = new List<Right>();
                        
    foreach (Role role in this._roles)
                        {
                            
    foreach (Right right in role.Rights)
                            {
                                
    if (! this._rights.Contains(right))
                                {
                                    
    this._rights.Add(right);
                                }
                            }
                        }
                    }
                    
    return this._rights;
                }
            }

            
    public User()
            {
                
    this._id = -1;
                
    this._roles = new List<Role>();
                
            }
                }
    User.hbm.xml配置文件
    <?xml version="1.0" encoding="utf-8" ?> 
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
        
    <class name="Cuyahoga.Core.Domain.User, Cuyahoga.Core" table="cuyahoga_user">

            
    <cache usage="read-write" />
            
            
    <id name="Id" column="userid" type="Int32" unsaved-value="-1">
                
    <generator class="native">
                    
    <param name="sequence">cuyahoga_user_userid_seq</param>
                
    </generator>
            
    </id>
            
    <property name="UserName" column="username" type="String" length="50" />
            
    <property name="Password" column="password" type="String" length="100" />        
                    
    <!多对多单项关联:--key和many-to-many都必须指定column属性,
                      key和many
    -to-many分别指定本持久化类,关联类在连接表中的外键列名,
                      因此两边的key与many
    -to-many的column属性交叉相同。cuyahoga_userrole为关联表-->
                    
    <bag name="Roles" table="cuyahoga_userrole" cascade="none" lazy="true">
                
    <cache usage="read-write" />
                
    <key column="userid" />
                
    <many-to-many class="Cuyahoga.Core.Domain.Role, Cuyahoga.Core" column="roleid" outer-                        join="true" />
                
    </bag>
        
    </class>
    </hibernate-mapping>

    2.实体类Role以及hbm.xml配置
       
    //实体类Role
        public class Role
        {
            
    private int _id;
            
    private string _name;
            
    private IList<Right> _rights;
            
    private IList<Site> _sites;
                    
    public Role()
            {
                
    this._id = -1;
                
    this._name = null;
                
    this._rights = new List<Right>();
                
    this._sites = new List<Site>();
            }
            
    public virtual int Id
            {
                
    get { return this._id; }
                
    set { this._id = value; }
            }
            [ValidateNonEmpty(
    "RoleNameValidatorNonEmpty")]
            [ValidateLength(
    150"RoleNameValidatorLength")]
            
    public virtual string Name
            {
                
    get { return this._name; }
                
    set { this._name = value; }
            }
                    
    public virtual IList<Right> Rights
            {
                
    get { return _rights; }
                
    set { _rights = value; }
            }

            
    public virtual IList<Site> Sites
            {
                
    get { return _sites; }
                
    set { _sites = value; }
            }
           }
       
    //Role.hbm.xml配置文件如下:
      -----------------------------------------------------------------------------
       
    <?xml version="1.0" encoding="utf-8" ?> 
       
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
        
    <class name="Cuyahoga.Core.Domain.Role, Cuyahoga.Core" table="cuyahoga_role">
            
    <cache usage="read-write" />
            
    <id name="Id" column="roleid" type="Int32" unsaved-value="-1">
                
    <generator class="native">
                    
    <param name="sequence">cuyahoga_role_roleid_seq</param>
                
    </generator>
            
    </id>
            
    <property name="Name" column="name" type="String" length="50" />
                    
    <!Role:Right多对多单项关联:----角色:权限----->
            
    <bag name="Rights" cascade="none" lazy="true" table="cuyahoga_roleright">
                
    <cache usage="read-write" /><!--方法到进程间缓存-->
                
    <key column="roleid" />
                
    <many-to-many class="Cuyahoga.Core.Domain.Right, Cuyahoga.Core"  column="rightid"  />
            
    </bag>
                    
    <!Role:Site多对多单项关联:----角色:站点  ----->                                                                                                
            
    <bag name="Sites" cascade="none" lazy="true" table="cuyahoga_siterole">
                
    <key column="roleid" />
                
    <many-to-many class="Cuyahoga.Core.Domain.Site, Cuyahoga.Core" column="siteid" />
            
    </bag>
            
        
    </class>
    </hibernate-mapping>
    --------------------------------------------------------------------------------------------------------
     
    3.Right实体类和hbm.xml配置文件
      Right实体类如下: 
      
    public class Right
        {
            
    private int _id;
            
    private string _name;
            
    private string _description;

            
    /// <summary>
            
    /// ID
            
    /// </summary>
            public virtual int Id
            {
                
    get { return _id; }
                
    set { _id = value; }
            }

            
    /// <summary>
            
    /// Name of the right.
            
    /// </summary>
            public virtual string Name
            {
                
    get { return _name; }
                
    set { _name = value; }
            }

            
    /// <summary>
            
    /// Description of the right.
            
    /// </summary>
            public virtual string Description
            {
                
    get { return _description; }
                
    set { _description = value; }
            }

            
    /// <summary>
            
    /// Constructor.
            
    /// </summary>
            public Right()
            {
                
    this._id = -1;
            }
        }
      Right.hbm.xml配置文件    
    ---------------------------------------------------------------------------------
      
    <?xml version="1.0" encoding="utf-8" ?>
      
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
        
    <class name="Cuyahoga.Core.Domain.Right, Cuyahoga.Core" table="cuyahoga_right">

            
    <cache usage="read-only" />

            
    <id name="Id" column="rightid" type="Int32" unsaved-value="-1">
                
    <generator class="native">
                    
    <param name="sequence">cuyahoga_right_rightid_seq</param>
                
    </generator>
            
    </id>

            
    <property name="Name" column="name" type="String" length="50" />
            
    <property name="Description" column="description" type="String" length="255" />

        
    </class>
    </hibernate-mapping>    
    ------------------------------------------------------------------------------------------
    4.Site实体类以及配置文件

    Site实体类
    public class Site
    {
            
    private int _id;
            
    private Template _defaultTemplate;
            
    private Role _defaultRole;
            
    private IList<Node> _rootNodes;
            
    private IList<Role> _roles;
            
    private IList<Template> _templates;
            
    private IList<Category> _rootCategories;
                
    #region properties
            
    public virtual int Id
            {
                
    get { return this._id; }
                
    set { this._id = value; }
            }
            
    public virtual Role DefaultRole
            {
                
    get { return this._defaultRole; }
                
    set { this._defaultRole = value; }
            }
            
    public virtual IList<Node> RootNodes
            {
                
    get { return this._rootNodes; }
                
    set { this._rootNodes = value; }
            }
            
    public virtual IList<Role> Roles
            {
                
    get { return _roles; }
                
    set { _roles = value; }
            }

            
    public virtual IList<Template> Templates
            {
                
    get { return _templates; }
                
    set { _templates = value; }
            }
            
    public virtual IList<Category> RootCategories
            {
                
    get { return _rootCategories; }
                
    set { _rootCategories = value; }
            }
            
    public Site()
            {
                
    this._id = -1;
                
    this._rootNodes = new List<Node>();
                
    this._roles = new List<Role>();
                
    this._templates = new List<Template>();
                
    this._rootCategories = new List<Category>();
            }
        }
    Site.hbm.xml配置文件如下:
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
        
    <class name="Cuyahoga.Core.Domain.Site, Cuyahoga.Core" table="cuyahoga_site">

            
    <cache usage="read-write" />

            
    <id name="Id" column="siteid" type="Int32" unsaved-value="-1">
                
    <generator class="native">
                    
    <param name="sequence">cuyahoga_site_siteid_seq</param>
                
    </generator>
            
    </id>
            
    <many-to-one name="DefaultTemplate" class="Cuyahoga.Core.Domain.Template, Cuyahoga.Core" column="templateid" not-null="false" outer-join="false" />
            
    <many-to-one name="DefaultRole" class="Cuyahoga.Core.Domain.Role, Cuyahoga.Core" column="roleid" not-null="true" outer-join="true" />
            
    <bag name="RootNodes" cascade="none" where="parentnodeid is null" order-by="position asc" lazy="true">
                
    <key column="siteid" />
                
    <one-to-many class="Cuyahoga.Core.Domain.Node, Cuyahoga.Core" />
            
    </bag>
            
    <bag name="Roles" cascade="none" table="cuyahoga_siterole" lazy="true">
                
    <key column="siteid" />
                
    <many-to-many class="Cuyahoga.Core.Domain.Role, Cuyahoga.Core" column="roleid" />
            
    </bag>
            
    <bag name="Templates" cascade="none" lazy="true" inverse="true">
                
    <key column="siteid" />
                
    <one-to-many class="Cuyahoga.Core.Domain.Template, Cuyahoga.Core" />
            
    </bag>
            
    <bag name="RootCategories" cascade="none" where="parentcategoryid is null" order-by="path asc" lazy="true" inverse="true">
                
    <key column="siteid" />
                
    <one-to-many class="Cuyahoga.Core.Domain.Category, Cuyahoga.Core" />
            
    </bag>
        
    </class>
    </hibernate-mapping>

  • 相关阅读:
    python3 sorted()函数解析
    MySql 关键字
    python的 a,b=b,a+b 和 a=b b=a+b 的区别
    python3 all() 函数用于检查实参
    Python3 urllib模块
    Python3 shutil模块
    Python3 sys模块
    Python 异常处理和断言
    Python3 os模块
    Pytho3 file open方法
  • 原文地址:https://www.cnblogs.com/hubcarl/p/1706394.html
Copyright © 2020-2023  润新知