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" 注意此处的名称

你可能感兴趣的:(Hibernate)