Nhibernate 一对多 与 一对一

  上来园子就看到些标题党,觉着气氛怪怪的,为什么不是专注在自己感兴趣的领域呢.

  在开发过程中使用nhibernate的时候会遇到一对一与一对多的关系,这里记下来方便自己也方便别人查看,希望遇到同样问题的同学少走弯路,能把更多精力放在业务逻辑上,需要的同学自己采用,有建议可以提。

现在关系是这样的,用户基本表一张,里面存储着用户的一些基本信息;用户扩展表一张,里面存储着用户的扩展信息比如用户偏好,生日(这些至于为什么不是放在一起每个人有自己的想法),用户消费记录表一张记录了消费信息。第一步新建用户类如下:

1 public class User{

2      public virtual Int32 Id{get;set;}

3      public virtual String UserToken{get;set;} 

4      public virtual String UserName{get;set;}

5      public virtual String UserPwd {get;set;}

6       public virtual virtual ISet<UserCostHistory> UserCostHistory { get; set; }

7     public virtual UserExten UserExten { get; set; }              

8 }
View Code

第二步新建用户扩展类如下(可能后期改过部分字段,大家主要参考配置就是了)

 1  public  class UserExten

 2     {

 3         public virtual Int32 Id { get; set; }

 4         public virtual String UserImg { get; set; }

 5         public virtual String TrueName { get; set; }

 6         public virtual DateTime? UserBirthday { get; set; }

 7     

 8 

 9         public User User { get; set; }

10    }

这里是用户扩展表,虽然是通过UserId 相关联,但是在字段里没有写UserId,只是在后面有一个user的属性。

第三步新建用户消费表如下:

 1 using System;

 2 

 3 namespace Beauty.Core.Model

 4 {

 5     [Serializable]

 6     public  class UserCostHistory

 7     {

 8         public virtual Int32 Id { get; set; }

 9         /// <summary>

10         /// 用户Token

11         /// </summary>

12         public virtual String UToken { get; set; }

13         /// <summary>

14         /// 订单编号

15         /// </summary>

16         public virtual String OrderNumber { get; set; }

17         /// <summary>

18         /// 店铺TOKEN

19         /// </summary>

20         public virtual String ShopToken { get; set; }

21         /// <summary>

22         /// 消费金额

23         /// </summary>

24         public virtual Decimal Cost { get; set; }

25       

26         /// <summary>

27         /// 消费时间

28         /// </summary>

29         public virtual DateTime CostOn { get; set; }

30         /// <summary>

31         /// 备注

32         /// </summary>

33         public virtual String Note { get; set; }

34         public virtual User User { get; set; }

35     }

36 }

这里是用户消费表,表建到这里就完了,这里存在着一对多与一对一的关系,每个用户都包含着扩展的信息,每个用户有一条或者多条消费信息。在nhibernate 中应该怎么配置呢,请看如下配置,第一个是用户的

 1 <?xml version="1.0" encoding="utf-8" ?>

 2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Beauty.Core" namespace="Beauty.Core.Model">

 3 

 4   <class name="User" table="`User`" lazy="false" >

 5      <cache usage="read-write"/>

 6      <id name="Id" column="Id" type="Int32">

 7       <generator class="identity"/>

 8     </id>

 9     <property name="Token" length="50"  type="String" column="Token"  />

10     <property name="UName" length="50"  type="String" column="UName" />

11     <property name="UPwd" length="50" type="String" column="UPwd"/>

12     <property name="CreateOn" column="CreateOn"  />

13     <property name="CategoryId" type="Int32" column="CategoryId" />

14     <property name="TrueName" type="String" length="20" column="TrueName" />

15     <property name="ShopId" type="Int32" column="ShopId" />

16     <property name="CardId" type="String" column="CardId" length="20"  />

17     

18     <property name="UserNumber" type="String" column="UserNumber" length="20" />

19     <property name="UserIntegral" type="Int32" column="UserIntegral" />

20     <property name="UserLevel" type="Int32" column="UserLevel" />

21     <property name="Amount" type="Decimal" column="Amount" />

22     <property name="Sex" type="Int32" column="Sex" />

23     

24     <property name="Logins" type="Int32" column="Logins" />

25     <property name="Email" type="String" column="Email" length="20" />

26     <property name="UTel" type="String" column="UTel" length="20" />

27 

28     <set name="UserCostHistory" inverse="false" lazy="false" cascade="all"  >

29       <key  column="User_Id">

30         

31       </key>

32       <one-to-many class="UserCostHistory" />

33     </set>

34 

35     <one-to-one property-ref="User" class="UserExten" name="UserExten" cascade="all" lazy="false"  constrained="true" >

36           

37     </one-to-one>

38   </class>

39 </hibernate-mapping>

这里的one-to-one 就是一对一的配置关键了,roperty-ref 是主体,class="UserExten"是指一对一的那个类,重要的就是这两个,后面的几个属性百度一下大把的可以自己研究

<set name="UserCostHistory" inverse="false" lazy="false" cascade="all" >
<key column="User_Id">

</key>
<one-to-many class="UserCostHistory" />
</set>

这里是一对多的配置,inverse="false"这个配置很重要,少了可能会有错误,当时是个什么错误我也记不得了重现也不大现实。column 是关联的列,one-to-many class 这个就类名,因为我写的时候为了方便团队成员查看所以类名与表名一致,set的用法可以百度下这里主要是讲其配置,上面是user的下面要说的是扩展与消费的配置,扩展的配置如下:

 1 <?xml version="1.0" encoding="utf-8" ?>

 2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Beauty.Core" namespace="Beauty.Core.Model">

 3 

 4   <class name="UserExten" table="UserExten" lazy="false" >

 5      <cache usage="read-write"/>

 6      <id name="Id" column="Id" type="Int32">

 7       <generator class="identity"/>

 8     </id>

 9     <property name="UserImg" column="UserImg"  />

10     <property name="TrueName" column="TrueName" />

11     <property name="UserBirthday" column="UserBirthday" />

12 

13     

14     <many-to-one name="User" class="User" column="User_Id" unique="true" cascade="all"/>

15 

16   </class>

17 </hibernate-mapping>

  这里没什么特殊的就是一个many to one 的标签与user对应,column 是对应的关联字段 unique 是限制只有一条的一个属性,因为其实是一个特殊的一对多,因为多的那个唯一了就成了一对一了。最后是用户消费的配置:

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Beauty.Core" namespace="Beauty.Core.Model">



  <class name="UserCostHistory" table="UserCostHistory" lazy="false" >

     <cache usage="read-write"/>

     <id name="Id" column="Id" type="Int32">

      <generator class="identity"/>

    </id>

    

    <property name="CostTime" column="CostTime">

      

    </property>

    <property name="Amount" column="Amount" />

    <many-to-one name="User" class="User" column="User_Id" cascade="all" />



  </class>

</hibernate-mapping>

这里也是最后那个一对多的标记,与一对一的不同之处就是unique,前面也说过了一对一就是一个特殊的一对多的关系而已,看的时候要联系起来看。这个配置完成后数据库里会自己产生外键关联,请大家自己参考,到此结束,有什么问题可以说说大家一起探讨。

你可能感兴趣的:(Hibernate)