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

下面以一个实例进行一下演示:

您可以先下载Demo比对阅读:Demo源代码下载 

 

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 { getset; }
        
public virtual string USER_NAME { getset; }
        
public virtual string PASSWORD { getset; }


        
//注意此处:表明UserInfo与UserProfileInfo为 1:n 
        public virtual IList<UserProfileInfo> UserProfiles { getset; }

    }
//
}//

 

 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 { getset; }


        
public virtual string PROFILE_VALUE { getset; }

    }
}

 

 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 { getset; }
        
public virtual string PROFILE_KEY { getset; }


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

 

 

 

相关文章:

  • 2022-12-23
  • 2021-05-28
  • 2022-12-23
  • 2022-12-23
  • 2021-08-08
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-27
  • 2021-08-24
  • 2021-09-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-24
相关资源
相似解决方案