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" 注意此处的名称
原文地址:https://www.cnblogs.com/kaixiangbb/p/3429943.html