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 }

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

 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,前面也说过了一对一就是一个特殊的一对多的关系而已,看的时候要联系起来看。这个配置完成后数据库里会自己产生外键关联,请大家自己参考,到此结束,有什么问题可以说说大家一起探讨。

Nhibernate 一对多 与 一对一,布布扣,bubuko.com

时间: 2024-10-06 06:24:31

Nhibernate 一对多 与 一对一的相关文章

[NHibernate]一对多关系(关联查询)

目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关系的关联查询.前面文章中也介绍的nhibernate的查询:HQL,条件查询,原生SQL查询. 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernat

利用hibernate实现数据库对象关联(多对一、一对多、一对一、多对多)

核心思想: 数据库表对应java类(表-类),表的字段对应类的属性(字段-属性) 关联:把数据库中的外键映射,变成对象的关联关系. 多对一,一对多,一对一,多对多 单向,双向 一.单向,多对一(Info,Nation多个人有同一个民族)准备两个基本类和映射文件1.给类加关联对象 import java.util.Date; public class Info { private String code; private String name; private Boolean sex; priv

[NHibernate]一对多关系(级联删除,级联添加)

目录 写在前面 文档与系列文章 一对多关系 一个例子 级联删除 级联保存 总结 写在前面 在前面的文章中,我们只使用了一个Customer类进行举例,而在客户.订单.产品中它们的关系,咱们并没有涉及,比如一个客户可以有一个或者多个订单,在数据库中变现为“主外键关系”,有时也喜欢称为“父子关系”.那么就让我们一起学习,在nhibernate中,是如何处理这种关系的吧? 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernat

Hibernate(七)__多对一 、一对多、 一对一、多对多

1.many-to-one 以学生和部门之间的关系为例: Department.hbm.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-

Hibernate关联关系配置(一对多、一对一和多对多)

第一种关联关系:一对多(多对一) "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系. 一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多. 多对一:从订单的角度来说多个订单可以对应一个消费者,即为多对一. 一对多关系在hbm文件中的配置信息: 消费者(一方): <?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC

[Fluent NHibernate]一对多关系处理

目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的学习你会发现,Fluent Nhibernate仍然需要引用Nhibernate的两个程序集(Nhibernate.dll和Iesi.Collections.dll),所以与Nhibernate最大的区别就在生成配置文件的方式上面,这里关于Nhibernate的特性方面就不再多赘述,可以参考Nhib

mybatis 一对多和一对一写法注意事项

<resultMap id="ChartResultMap" type="com.qif.dsa.ucenter.planinfo.entity.ChartDate"> <id column="time" jdbcType="VARCHAR" property="time"/> <collection property="planChartList" jav

jpa的双向一对多和双向一对一关联关系

在分享之前先给大家看两个异常,应该说这一类的异常还是很常见的,主要原因是jar包冲突 异常1: java.lang.NoSuchFieldError: INSTANCE at org.hibernate.type.BasicTypeRegistry.<init>(BasicTypeRegistry.java:94) at org.hibernate.type.TypeResolver.<init>(TypeResolver.java:59) at org.hibernate.cfg

mybatis的面试一对一,一对多,多对多的mapper.xml配置

使用springboot完成一对一,一对多: https://blog.csdn.net/KingBoyWorld/article/details/78966789 传统的mapper文件中的一对一,一对多: 一对一: 主要是<resultMap>与<association> 一对多: 主要是<collection> 多对多: 原文地址:https://www.cnblogs.com/fengli9998/p/8663633.html