zoukankan      html  css  js  c++  java
  • NHibernate使用复合主键(一)

    引用:http://blog.csdn.net/liangxunjian/archive/2006/08/11/1048625.aspx

    主要是关于:<composite-id>元素接受<key-property>

                         将在使用复合主键(2)中讲到<key-many-to-one>

    属性映射我目前在实施一个.net项目中,使用了ORM工具,参考了java的hibernate,选用了.NET的NHibernate,在开发过程中出现数据库中表的复合主键的情况,其实它跟hibernate中使用的复合主键的情况雷同,但参照了相关的帮助文档,还是要费了一些小的工夫,才能解决了问题.为了避免以后再出现重复问题而浪费时间,现在将在NHibernate中复合主键使用做了以下详细的说明.

      本人在测试过程中,建立了一个简单的图书馆管理系统应用工程,数据库中主要的表简要设计如下:

      Users表(用户信息表):

       UserID char(10) not null primary key,

             UserName varchar(50)

          Books表(图书信息表):

      BSN char(10) not null primary key,

            BookName  varchar(50)

     BorrowRecord表(图书借还登记表):

      UserID char(10) not null,

            BSN char(10) not null,

            BorrowDate DateTime not null,

            ReturnDate DateTime,

      constraint PK_Library primary key (UserID,BSN,BorrowDate)

         手工书写的ORM映射文件如下:

    ======================================================================    

    User类:

               using System;
               using System.Collections.Generic;
               using System.Text;

               namespace NHDataLayer.NHibernate.Entities
               {

                          [Serializable]
                          public class User
                          {
                                 public User()
                                 {
                                 }

                                private string userID;
                                public virtual string UserID
                                {
                                    set
                                    {
                                        userID = value;
                                    }
                                   get
                                   {
                                        return userID;
                                   }
                          }

                         private string userName;
                         public virtual string UserName
                         {
                               set
                               {
                                   userName = value;
                               }
                              get
                              {
                                   return userName;
                              }
                         }
                   }
       
             }

    User的xml映射文件(User.hbm.xml):

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
    <class name="NHDataLayer.NHibernate.Entities.User,NHDataLayer" table="Users">
        <id name="UserID" type="String" length="10">
          <generator class="assigned" />
        </id>
        <property name="UserName" type="String" length="50"/>
    </class>
    </hibernate-mapping>

    =====================================================================

    ======================================================================       

    Books类:

                 using System;
                 using System.Collections.Generic;
                 using System.Text;

                 namespace NHDataLayer.NHibernate.Entities
                 {
                       [Serializable]
                       public class Books
                       {
                             public Books()
                             {
                             }

                             private string bSN;
                             public virtual string BSN
                             {
                                  set
                                  {
                                      bSN = value;
                                  }
                                  get
                                  {
                                     return bSN;
                                  }
                             }

                            private string bookName;
                            public virtual string BookName
                            {
                                  set
                                  {
                                       bookName = value;
                                  }
                                 get
                                 {
                                    return bookName;
                                 }
                            }

                           private DateTime publishDate;
                           public virtual DateTime PublishDate
                           {
                                set
                                {
                                     publishDate = value;
                                }
                                get
                                {
                                    return publishDate;
                                }
                           }

                         private string publisher;
                         public virtual string Publisher
                         {
                               set
                               {
                                    publisher = value;
                               }
                              get
                              {
                                   return publisher;
                              }
                         }

                        private string authors;
                        public virtual string Authors
                        {
                           set
                           {
                                authors = value;
                           }
                          get
                          {
                              return authors;
                          }
                      }

                     public override bool Equals(object obj)
                     {
                            return base.Equals(obj);
                     }

                     public override int GetHashCode()
                    {
                          return base.GetHashCode();
                    }

                }
            }

    Books的xml映射文件(Book.hbm.xml):

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
    <class name="NHDataLayer.NHibernate.Entities.Books,NHDataLayer" table="Books">
        <id name="BSN" type="String" length="20">
          <generator class="assigned" />
        </id>
        <property name="BookName" type="String" length="50"/>
        <property name="PublishDate" type="DateTime"/>
        <property name="Publisher" type="String" length="100"/>
        <property name="Authors" type="String" length="50"/>
    </class>
    </hibernate-mapping>

    ==================================================================

    ===================================================================

           BorrowRecord类:

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace NHDataLayer.NHibernate.Entities
    {
        [Serializable]
        public class BorrowRecord
        {
            public BorrowRecord()
            {

            }

            private BorrowRecordPK borrowPK;
            public virtual BorrowRecordPK BorrowPK
            {
                set
                {
                    borrowPK = value;
                }
                get
                {
                    return borrowPK;
                }
            }

            private int total;
            public virtual int Total
            {
                set
                {
                    total = value;
                }
                get
                {
                    return total;
                }
            }

            private DateTime returnDate;
            public virtual DateTime ReturnDate
            {
                set
                {
                    returnDate = value;
                }
                get
                {
                    return returnDate;
                }
            }

            /// <summary>
            /// 判断两个对象是否相同,这个方法需要重写
            /// </summary>
            /// <param name="obj">进行比较的对象</param>
            /// <returns>真true或假false</returns>
            public override bool Equals(object obj)
            {
                if (obj is BorrowRecord)
                {
                    BorrowRecord second = obj as BorrowRecord;
                    if (this.BorrowPK.UserID == second.BorrowPK.UserID
                         && this.BorrowPK.BSN == second.BorrowPK.BSN
                         && this.BorrowPK.BorrowDate == second.BorrowPK.BorrowDate)
                    {
                        return true;
                    }
                    else return false;
                }
                return false;
            }

            public override int GetHashCode()
            {
                return base.GetHashCode();
            }
        }

    }


    BorrowRecord复合主键类:

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace NHDataLayer.NHibernate.Entities
    {
        [Serializable]
        public class BorrowRecordPK
        {
            public BorrowRecordPK()
            {
            }

            private string userID;
            public virtual string UserID
            {
                set
                {
                    userID = value;
                }
                get
                {
                    return userID;
                }
            }

            private string bSN;
            public virtual string BSN
            {
                set
                {
                    bSN = value;
                }
                get
                {
                    return bSN;
                }
            }

            private DateTime borrowDate;
            public virtual DateTime BorrowDate
            {
                set
                {
                    borrowDate = value;
                }
                get
                {
                    return borrowDate;
                }
            }

            public override bool Equals(object obj)
            {
                return base.Equals(obj);
            }

            public override int GetHashCode()
            {
                return base.GetHashCode();
            }
        }
    }

    BorrowRecord的xml映射文件(BorrowRecord.hbm.xml):

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
    <class name="NHDataLayer.NHibernate.Entities.BorrowRecord,NHDataLayer" table="BorrowRecord">
        <composite-id name="BorrowPK" class="NHDataLayer.NHibernate.Entities.BorrowRecordPK,NHDataLayer">
          <key-property name="UserID"/>
          <key-property name="BSN"/>
          <key-property name="BorrowDate"/>
        </composite-id>
        <property name="ReturnDate" type="DateTime"/>
        <property name="Total" type="Int16"/>
    </class>
    </hibernate-mapping>


    ==============================================================================

    主要要注意的是:

    1、使用了复合主键类要重写Equals()和GetHashCode()方法。

    2、要将该复合类Serializable.

    3、xml映射文件要设置为嵌入的资源。


    这样,我们就可以使用ISession的Get()或Load()方法,通过键获取实体了。

    关于更详细的信息,请参考NHibernate的相关文档。

  • 相关阅读:
    二十二、Linux 进程与信号---进程创建
    二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识
    二十一、Linux 进程与信号---进程资源限制
    二十、Linux 进程与信号---非局部跳转
    AOSP android 源码下载
    十九、Linux 进程与信号---环境表
    十八、Linux 进程与信号---进程介绍
    09 scroll系列_简单的封装动画函数(变速(缓动)的动画函数_getComputedStyle函数_复杂的动画函数封装_颜色相关_案例_client系列
    A 第二课 栈_队列_堆
    pycharm 的快捷键
  • 原文地址:https://www.cnblogs.com/millen/p/1626550.html
Copyright © 2011-2022 走看看