zoukankan      html  css  js  c++  java
  • NHibernate composite-id联合主键配置

    NHibernate的联合主键配置比较复杂,初次配置可能需要花些时间,但只要我们理解了,掌握一定的步骤还是很容易的。

    1、设计数据结构

    Users:用户表

    名称 Users
    说明 用户表
    序号 字段名称 数据类型(长度) 允许空 描述 备注说明
    1 USER_ID VARCHAR(32)   用户ID PK
    2 USER_NAME VARCHAR(50)   用户名  
    3 PASSWORD VARCHAR(32)   密码  
    4          
    5          
    主键 USER_ID


    UserProfiles:用户Profile表

    名称 UserProfiles
    说明 用户Profile表
    序号 字段名称 数据类型(长度) 允许空 描述 备注说明
    1 USER_ID VARCHAR(32)   用户ID PK
    2 PROFILE_KEY VARCHAR(50)   Key键值
    3 PROFILE_VALUE VARCHAR(10)   Value值  
    4          
    5          
    主键 USER_ID,PROFILE_KEY

    2、设计持久化类

    UserInfo.cs

    代码 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace LXJ.NHibernate.Demo.Model.Auth
    {
        public class UserInfo
        {
    
            public virtual string USER_ID { get; set; }
            public virtual string USER_NAME { get; set; }
            public virtual string PASSWORD { get; set; }
    
    
            //注意此处:表明UserInfo与UserProfileInfo为 1:n 
            public virtual IList<UserProfileInfo> UserProfiles { get; set; }
    
        }//
    }//

     UserProfileInfo.cs

    代码 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace LXJ.NHibernate.Demo.Model.Auth
    {
        public class UserProfileInfo
        {
            //把组合主键(USER_ID,PROFILE_KEY)抽象成一个类UserProfilePKInfo
            public virtual UserProfilePKInfo UserProfilePK { get; set; }
    
    
            public virtual string PROFILE_VALUE { get; set; }
    
        }
    }

     UserProfilePKInfo.cs

    代码 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace LXJ.NHibernate.Demo.Model.Auth
    {
        public class UserProfilePKInfo
        {
            public virtual string USER_ID { get; set; }
            public virtual string PROFILE_KEY { get; set; }
    
    
            /// <summary>
            /// 判断两个对象是否相同,这个方法需要重写
            /// </summary>
            /// <param name="obj">进行比较的对象</param>
            /// <returns>真true或假false</returns>
            public override bool Equals(object obj)
            {
                if (obj is UserProfilePKInfo)
                {
                    UserProfilePKInfo pk = obj as UserProfilePKInfo;
                    if (this.USER_ID == pk.USER_ID
                         && this.PROFILE_KEY == pk.PROFILE_KEY)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                return false;
            }
    
            public override int GetHashCode()
            {
                return base.GetHashCode();
            }
    
        }
    }

     注意:UserProfilePKInfo类必须对Equals和GetHashCode方法进行重写。

    3、配置映射文件

    UserInfo.hbm.xml

    代码 

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LXJ.NHibernate.Demo.Model" namespace="LXJ.NHibernate.Demo.Model.Auth">
    
        <class  name="LXJ.NHibernate.Demo.Model.Auth.UserInfo, LXJ.NHibernate.Demo.Model" table="Users">
    
            <id name="USER_ID" column="USER_ID" type="String" length="32">
                <generator class="assigned" />
            </id>
            <property name="USER_NAME" column="USER_NAME" type="String" length="50" not-null ="true"/>
            <property name="PASSWORD" column="PASSWORD" type="String" length="32" not-null ="true"/>
    
    
            <bag name="UserProfiles" inverse="true" lazy="true" cascade="all-delete-orphan">
                <key column="USER_ID"/>
                <one-to-many class="LXJ.NHibernate.Demo.Model.Auth.UserProfileInfo, LXJ.NHibernate.Demo.Model"/>
            </bag>
            
        </class>
    
    </hibernate-mapping>

     其中<bag>....</bag>节是配置Users与UserProfiles的一对多映射关系,UserProfiles为类UserInfo中的属性

    UserProfileInfo.hbm.xml

    代码 
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LXJ.NHibernate.Demo.Model" namespace="LXJ.NHibernate.Demo.Model.Auth">
    
        <class  name="LXJ.NHibernate.Demo.Model.Auth.UserProfileInfo, LXJ.NHibernate.Demo.Model" table="UserProfiles">
    
            <composite-id name="UserProfilePK" class="LXJ.NHibernate.Demo.Model.Auth.UserProfilePKInfo, LXJ.NHibernate.Demo.Model">
                <key-property name="USER_ID" column="USER_ID" type="String" length="32" />
                <key-property name="PROFILE_KEY" column="PROFILE_KEY" type="String" length="50" />
            </composite-id>
    
            <property name="PROFILE_VALUE" column="PROFILE_VALUE" type="String" length="100" not-null ="true"/>
        </class>
    
    </hibernate-mapping>

     

     注意:

    • <composite-id> .... </composite-id>配置节依赖于类UserProfilePKInfo
    • composite-id name="UserProfilePK" 注意此处的名称
  • 相关阅读:
    2、Windows 系统下安装 IntelliJ IDEA
    1、IntelliJ IDEA 使用说明
    C# static的用法详解
    wpf 加载窗体界面时出现异常System.IO.FileNotFoundException
    ObservableCollection绑定到TextBox
    Lambda表达式(转载)
    C#中out和ref之间的区别 转载
    WPF序列化与反序列化
    软件版本号规范与命名原则 转载
    WPF DataGrid滚动条滑动的时候背景色错乱或显示不全
  • 原文地址:https://www.cnblogs.com/kaixiangbb/p/3429943.html
Copyright © 2011-2022 走看看