顺藤摸瓜【Nhibernate 关联映射--多对一】

现有两个实体,Dog
和 Master
,映射到数据库表中如上图所示。一个Dog只允许对应一个Master,但一个Master可以有多个Dog。我们在查询Dog的时候,往往还需要知道其主人Master的信息,也就是说,如果已知一个Dog的信息,想一次来顺藤摸瓜找到Master的信息,此时用Nhibernate如何去实现呐?这里就用到了多对一的关联映射方法。看我是如何实现的:

Nhibernate的整个搭建过程就不在赘述了,前面的两篇文章都已经详细展示了一下,下面仅仅展示多对一的实现方法。

首先构建实体类Dog和Master

Master
    public class Master
    {
        private string id;
        private string name;

        public Master()
        {
        }

        public virtual string Id
        {
            get { return id; }
            set { id = value; }
        }

        public virtual string Name
        {
            get { return name; }
            set { name = value; }
Dog
    public class Dog
    {
        private string id;
        private string name;
        private string sex;
        private string weight;
        private Master master;

        public Dog()
        {
        }

        public virtual string Id
        {
            get { return id; }
            set { id = value; }
        }

        public virtual string Name
        {
            get { return name; }
            set { name = value; }
        }

        public virtual string Sex
        {
            get { return sex; }
            set { sex = value; }
        }

        public virtual string Weight
        {
            get { return weight; }
            set { weight = value; }
        }

        public virtual  Master Master   //这里除了dog的基本属性外,还添加了Master类这个属性
        {
            get{ return master ; }
            set {  master=value ; }
        }

继续构建.hbm.xml 

Master
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="Model" assembly="Model">

  <class name="Master" table="Master">

    <id name="Id">
      <column name="MasterId" sql-type="char(32)" />
      <generator class="assigned" />
    </id>

    <property name="Name">
      <column name="Name"  sql-type="nvarchar(16)" />
    </property>

  </class>
</hibernate-mapping>
Dog
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="Model" assembly="Model">

  <class name="Dog" table="Dog" lazy="true">

    <id name="Id">
      <column name="DogId" sql-type="char(32)" />
      <generator class="assigned" />
    </id>

    <property name="Name">
      <column name="Name"  sql-type="nvarchar(16)" />
    </property>

    <property name="Sex"  >
      <column name="Sex" sql-type="nvarchar(16)" />
    </property>

    <property name="Weight"  >
      <column name="Weight" sql-type="nvarchar(16)" />
    </property>

    <many-to-one name="Master" column="MasterId" />  <!-- 这里多了这个标签,指明对应表中外键“MasterID”对应的是实体Master所对应表记录-->

  </class>
</hibernate-mapping>

客户端实现

<span style="font-family:FangSong_GB2312;font-size:14px;"><strong>插入记录</strong></span>
            Master master = new Master();
            master.Id = "masterid";
            master.Name = txtMName.Text.ToString();
            session.Save(master);

            Dog prince = new Dog();
            prince.Id = "dogid";
            prince.Name = txtDName .Text .ToString ();
            prince.Sex = txtSex .Text .ToString();
            prince.Weight = txtWeight .Text .ToString ();
            prince.Master = master;
<span style="font-family:FangSong_GB2312;font-size:14px;"><strong>查询记录</strong></span>
            Dog prince = new Dog();
            prince = (Dog)session.Get ("Dog","dogid" );

            txtinformation.Text = "赤丸的主人是:"+prince.Master.Name; //查出dog对象的同时,其Master的信息也就查了出来。

这是多对一关联映射的实现。关联映射还有一对一、一对多、多对多。这些映射的出现是为了增强Nhibernate的查询功能。更多的关联映射,接下来会继续研究学习。。

时间: 2024-11-09 00:30:44

顺藤摸瓜【Nhibernate 关联映射--多对一】的相关文章

[NHibernate]关联映射

系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate]O/R Mapping基础 [NHibernate]集合类(Collections)映射  引言 单向关联是最常用的也是最难正确使用的.在本文中会逐个经历规范的案例,从单向映射开始,然后涉及双向的案例.我们会在所有的例子中hi用Person和Address.例子中没有包括命名空间和程序集,我们把关

Hibernate关联映射多对多关联

在关系数据库中还有一种常见的关系,即多对多关联,下面以地址和人之间的关系来说明多对多关联,一个人可以去很对地方,同时,一个地址可以有多个人同时存在,因此,地址和人的关系可以看成是多对多的关系,地址(address)的结构表如图所示: 人(person)的结构表如图所示: 建立他们的多对多关联必须建立中间表(person_address),建立视图可以看到他们的多对多关系图如图所示: 在Hibernate中配置address和person表的多对多关联 1.新建一个项目工程 2.为工程添加Hibe

SSM学习08MyBatis关联映射多对多

和上一个相同还是<collection>是多对多映射,一个订单可能包含多个产品,而每个商品有可能出现在多个订单中,在数据库中这样的情况就需要一张中间表来维护. 1.在mybatis中建表: 1 create table tb_product( 2 id int(32) primary key auto_increment, 3 name varchar(32), 4 price double 5 ); 6 7 insert into tb_product values('1','Java基础入

NHibernate教程(11)--多对多关联查询

本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型: 在图上,我已经清晰的标注了表之间的关系,上两篇分析Customer和Order之间的"外键关系"或者称作"父子关系"."一对多关系"和关联查询,这一篇以Order为中心,分析Order和Product之间的关系,直接看下面一幅图的两张表: 上面两

Hibernate之关于多对多双向关联映射

[Hibernate]之关于多对多双向关联映射 多对多的双向关联映射在项目实战中还是相当重要的,所以这里着重写一下!以学生表(Student)和老师表(Teacher)为例. 首先我们还是先看Annotations配置! @Entity @Table(name="t_student") public class Student {     private Integer id;     private String name;     private Integer age;     

008多对一 关联映射 --- many-to-one

多对一 --- many-to-one 一对多 --- one-to-many 一对一 --- one-to-one 多对多 --- many-to-many 场景:用户和组:从用户角度来,多个用户属于一个组(多对一 关联) 使用hibernate开发的思路:先建立对象模型(领域模型),把实体抽取出来. 目前两个实体:用户和组两个实体,多个用户属于一个组,那么一个用户都会对应于一个组,所以用户实体中应该有一个持有组的引用. 关联映射的本质: 将关联关系映射到数据库,所谓的关联关系是对象模型在内存

MyBatis 系列五 之 关联映射

MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultMap type="Dept" id="deptMapper"> <id property="deptNo" column="deptNo"/> <result property="deptName

一口一口吃掉Hibernate(六)——多对多关联映射

今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就是典型的多对多关联的例子.而单向关联映射则是只能由A端去操作B端,B端不能操作A端的数据.而双向关联映射则是A,B两端都可以操作另一端的数据. 先说单向关联映射,实体类如下: <span style="font-size:18px">/** * 学生类 * @author Lo

一口一口吃掉Hibernate(四)——多对一单向关联映射

hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的.一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它. 今天就来说说多对一的关联映射. 数据库中有多对一的关系,Hibernate自然也有对象的多对一的关联关系.比如用户和用户组,一个用户只属于一个组,一个组有多名用户.我们就可以说用户和用户组的关系就是多对一的关系.用对象的uml图表示一下: 在Hibernate中如何来实现呢?首先定义这两个实体类: pac