• NHibernate使用复合主键(二)(包含一对多关系)


    接着使用复合主键(1)继续:

    还是那三张表哟!

    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)

    Users.UserID 对于 BorrowRecord.UserID 是 one-to-many

    Books.BSN 对于 BorrowRecord.BSN 是 one-to-many

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

    Users表

    namespace Model2
    {
    #region User

    /// <summary>
    /// User object for NHibernate mapped table 'Users'.
    /// </summary>
    public class User
    {
    #region Member Variables

    protected string _id;
    protected string _userName;
            protected IList _borrowRecord;

    #endregion

    #region Constructors

    public User() { }

    public User( string userName )
    {
       this._userName = userName;
    }

    #endregion

    #region Public Properties

    public virtual string Id
    {
       get {return _id;}
       set
       {
        if ( value != null && value.Length > 10)
         throw new ArgumentOutOfRangeException("Invalid value for Id", value, value.ToString());
        _id = value;
       }
    }

    public virtual string UserName
    {
       get { return _userName; }
       set
       {
        if ( value != null && value.Length > 50)
         throw new ArgumentOutOfRangeException("Invalid value for UserName", value, value.ToString());
        _userName = value;
       }
    }

            public virtual IList BorrowRecord
            {
                get
                {
                    if (_borrowRecord == null)
                    {
                        _borrowRecord = new ArrayList();
                    }
                    return _borrowRecord;
                }
                set { _borrowRecord = value; }
            }

           

    #endregion
    }
    #endregion
    }

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

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

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Model2.User, Model2" table="Users">
    <id name="Id" type="String" unsaved-value="null">
       <column name="UserID" length="10" sql-type="char" not-null="true" unique="true" index="PK_Users"/>
       <generator class="assigned" />
    </id>
    <property name="UserName" type="String">
       <column name="UserName" length="50" sql-type="varchar" not-null="false"/>
    </property>
        <bag name="BorrowRecord" inverse="true" lazy="true" cascade="all-delete-orphan">
          <key column="UserID"/>
          <one-to-many class="Model2.BorrowRecord, Model2"/>
        </bag>
    </class>
    </hibernate-mapping>

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

    Books类:

    namespace Model2
    {
    #region Book

    /// <summary>
    /// Book object for NHibernate mapped table 'Books'.
    /// </summary>
    public class Book
    {
    #region Member Variables

    protected string _id;
    protected string _bookName;
            protected IList _borrowRecord;

    #endregion

    #region Constructors

    public Book() { }

    public Book( string bookName )
    {
       this._bookName = bookName;
    }

    #endregion

    #region Public Properties

    public virtual string Id
    {
       get {return _id;}
       set
       {
        if ( value != null && value.Length > 10)
         throw new ArgumentOutOfRangeException("Invalid value for Id", value, value.ToString());
        _id = value;
       }
    }

    public virtual string BookName
    {
       get { return _bookName; }
       set
       {
        if ( value != null && value.Length > 50)
         throw new ArgumentOutOfRangeException("Invalid value for BookName", value, value.ToString());
        _bookName = value;
       }
    }

            public virtual IList BorrowRecord
            {
                get
                {
                    if (_borrowRecord == null)
                    {
                        _borrowRecord = new ArrayList();
                    }
                    return _borrowRecord;
                }
                set { _borrowRecord = value; }
            }
            #endregion
    }
    #endregion
    }

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

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

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Model2.Book, Model2" table="Books">
    <id name="Id" type="String" unsaved-value="null">
       <column name="BSN" length="10" sql-type="char" not-null="true" unique="true" index="PK_Books"/>
       <generator class="assigned" />
    </id>
    <property name="BookName" type="String">
       <column name="BookName" length="50" sql-type="varchar" not-null="false"/>
    </property>
        <bag name="BorrowRecord" inverse="true" lazy="true" cascade="all-delete-orphan">
          <key column="BSN"/>
          <one-to-many class="Model2.BorrowRecord, Model2"/>
        </bag>
    </class>
    </hibernate-mapping>

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

    BorrowRecord类:

    namespace Model2
    {
    #region BorrowRecord

    /// <summary>
    /// BorrowRecord object for NHibernate mapped table 'BorrowRecord'.
    /// </summary>

        //[Serializable]
        public class BorrowRecord
    {
    #region Member Variables

            protected BorrowRecordPK borrowPK;
            protected DateTime _returnDate;
          

    #endregion

    #region Constructors

    public BorrowRecord() { }

    public BorrowRecord( DateTime returnDate )
    {
       this._returnDate = returnDate;
    }

    #endregion

    #region Public Properties


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

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

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

    BorrowRecord复合主键类:

    namespace Model2
    {
       
        [Serializable]
        public class BorrowRecordPK
        {
            protected Book _book;
            protected User _user;
          

            public BorrowRecordPK()
            {
            }

            public virtual User User
            {
                set { _user = value; }
                get { return _user; }
           
            }

            public virtual Book Book
            {
                set { _book = value; }
                get { return _book; }

            }

            private DateTime borrowDate;

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

            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.2">
    <class name="Model2.BorrowRecord, Model2" table="BorrowRecord">
    <composite-id name="BorrowPK" class="Model2.BorrowRecordPK, Model2">
            <key-many-to-one name="User" class="Model2.User, Model2" column="UserID" />
            <key-many-to-one name="Book" class="Model2.Book, Model2" column="BSN" />
            <key-property name="BorrowDate" />
    </composite-id>
    <property name="ReturnDate" type="DateTime">
       <column name="ReturnDate" length="8" sql-type="datetime" not-null="false"/>
    </property>
    </class>
    </hibernate-mapping>

    主要要注意的是:

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

    2、要将该复合类Serializable.

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

  • 相关阅读:
    《极客时间--算法面试》--二叉树
    《极客时间--算法面试》-哈希表
    《极客时间-算法面试》-堆栈和队列
    《极客时间-算法面试》-数组和链表
    《极客时间-算法面试》
    《极客时间-算法面试》如何计算复杂度
    查找算法
    排序算法
    AI 期刊会议
    《剑指offer》数组中只出现一次的数字
  • 原文地址:https://www.cnblogs.com/millen/p/1626558.html
Copyright © 2020-2023  润新知