当前位置: 首页 > 工具软件 > imitate-One > 使用案例 >

nhibernate one to one,one to many

蒋飞捷
2023-12-01

nhibernate one to one,one to many??

一对多,和多对一的关系。连带查询 太神奇了。


步骤如下:

one to  one 的关键: 一对一的关系,两个表都是主键。


 增加一个model的属性 :

如果是一个 就是model对象

如果是多个就是list<model>

并且在hbm.xml中配置一对多 or 一对一的关系


配置如下:

《一》

 <bag name="lstUserCenter"   table="UserCenter" cascade="all" inverse="true" lazy="false">
      <key column="UserBelongID" />
      <one-to-many class="CH.YC.SocialManagement.Model.Entities.UserCenter, CH.YC.SocialManagement.Model" />
    </bag>


      public virtual UserBelong UserBelong { get; set; }


《多》

 <many-to-one name="UserBelong" column="UserBelongID" class="CH.YC.SocialManagement.Model.Entities.UserBelong" insert="false" not-found="ignore" />



        public virtual IList<UserCenter> lstUserCenter { get; set; }

 

完了之后会查询:

一对一的关系里 查询一表的数据连带出另表一个对象信息数据。

一对多的关系里 查询一个表的数据连带出 另一个表的多条数据 是list集合方式。


太棒了这种连带查询。



下面是百度相关信息 :

lazy,延迟加载

Lazy的有效期:只有在session打开的时候才有效;session关闭后lazy就没效了。

lazy策略可以用在:

* <class>标签上:可以取值true/false

* <property>标签上,可以取值true/false,这个特性需要类增强

* <set>/<list>等集合上,可以取值为true/false/extra

* <one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy



Inverse:

    是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录( Hibernate仅仅按照主控方对象的状态的变化来同步更新数据库。)



二、Inverse和Cascade的比较

Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。一般来说有一端要设为true。
Cascade:负责控制关联对象的级联操作,包括更新、删除等,也就是说对一个对象进行更新、删除时,其它对象也受影响,比如我删除一个对象,那么跟它是多对一关系的对象也全部被删除。
举例说明区别:删除“一”那一端一个对象O的时候,如果“多”的那一端的Inverse设为true,则把“多”的那一端所有与O相关联的对象外键清空;如果“多”的那一端的Cascade设为Delete,则把“多”的那一端所有与O相关联的对象全部删除。


Inverse和cascade是Hibernate映射中最难掌握的两个属性。两者都在对象的关联操作中发挥作用。

1.明确inverse和cascade的作用
inverse决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-many或many-to-many有效(因为只有这两种关联关系包含集合,而one-to-one和many-to-one只含有关系对方的一个引用)。
cascade决定是否把对对象的改动反映到数据库中,所以cascade对所有的关联关系都起作用(因为关联关系就是指对象之间的关联关系)。

2.inverse属性:inverse所描述的是对象之间关联关系的维护方式。
inverse只存在于集合标记的元素中。Hibernate提供的集合元素包括<set/> <map/> <list/> <array /> <bag />
Inverse属性的作用是:是否将对集合对象的修改反映到数据库中。
inverse属性的默认值为false,表示对集合对象的修改会被反映到数据库中;inverse=false 的为主动方,由主动方负责维护关联关系。
inverse=”true” 表示对集合对象的修改不会被反映到数据库中。

 为了维持两个实体类(表)的关系,而添加的一些属性,该属性可能在两个实体类(表)或者在一个独立的表里面,这个要看这双方直接的对应关系了: 这里的维护指的是当主控放进行增删改查操作时,会同时对关联关系进行对应的更新。

   一对多:该属性在多的一方。应该在一方的设置 inverse=true ,多的一方设置 inverse=false(多的一方也可以不设置inverse属性,因为默认值是false),这说明关联关系由多的一方来维护。如果要一方维护关系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update 操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。显然这样做的话,会减少很多操作,提高了效率。
注:
      单向one-to-many关联关系中,不可以设置inverse="true",因为被控方的映射文件中没有主控方的信息。

   多对多:属性在独立表中。inverse属性的默认值为false。在多对多关联关系中,关系的两端inverse不能都设为false,即默认的情况是不对的,如果都设为false,在做插入操作时会导致在关系表中插入两次关系。也不能都设为true,如果都设为true,任何操作都不会触发对关系表的操作。因此在任意一方设置inverse=true,另一方inverse=false。

   一对一:其实是一对多的一个特例,inverse 的设置也是一样的,主要还是看关联关系的属性在哪一方,这一方的inverse=false。

   多对一:也就是一对多的反过来,没什么区别。

2.cascade属性
cascade属性的作用是描述关联对象进行操作时的级联特性。因此,只有涉及到关系的元素才有cascade属性。
具有cascade属性的标记包括<many-to-one /> <one-to-one /> <any /> <set /><bag /> <idbag /> <list /> <array />
注意:<ont-to-many />和 <many-to-many />是用在集合标记内部的,所以是不需要cascade属性的。
级联操作:指当主控方执行某项操作时,是否要对被关联方也执行相同的操作。

3.inverse和cascade的区别
作用的范围不同:

     Inverse是设置在集合元素中的。
   Cascade对于所有涉及到关联的元素都有效。
   <many-to-one/><ont-to-many/>没有inverse属性,但有cascade属性
执行的策略不同
   Inverse 会首先判断集合的变化情况,然后针对变化执行相应的处理。
   Cascade 是直接对集合中每个元素执行相应的处理
执行的时机不同
     Inverse是在执行SQL语句之前判断是否要执行该SQL语句
     Cascade则在主控方发生操作时用来判断是否要进行级联操作
执行的目标不同
     Inverse对于<ont-to-many>和<many-to-many>处理方式不相同。
   对于<ont-to-many>,inverse所处理的是对被关联表进行修改操作。
   对于<many-to-many>,inverse所处理的则是中间关联表
     Cascade不会区分这两种关系的差别,所做的操作都是针对被关联的对象。

总结:
<one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护
<many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置
Cascade,通常情况下都不会使用。特别是删除,一定要慎重。
操作建议
  一般对many-to-one和many-to-many不设置级联,这要看业务逻辑的需要;对one-to-one和one-to-many设置级联。
  many-to-many关联关系中,一端设置inverse=”false”,另一端设置为inverse=”true”。在one-to-many关联关系中,设置inverse=”true”,由多端来维护关系表





 类似资料: