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映射文件要设置为嵌入的资源。

原文地址:https://www.cnblogs.com/millen/p/1626558.html