NHibernate项目应用:使用复合主键(2)

接着使用复合主键(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映射文件要设置为嵌入的资源。


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值