当前位置: 代码迷 >> Web前端 >> Hibernate多对一和多对一的修改有关问题
  详细解决方案

Hibernate多对一和多对一的修改有关问题

热度:210   发布时间:2012-11-26 11:48:50.0
Hibernate多对一和多对一的修改问题

Hibernate多对一和多对一的修改问题

Hibernate的实体类映射文件存在多对一的情况下:

比如  客房客房类型 就属于多对一的类型

如果在 money-to-one中设置了update=”false”的话,在需要更新客房的客房类型时,是不会更新成功的,其他属性是可以更新的,但是客房中的客房类型这个外键不会被更新

Room.hbm.xml文件

<hibernate-mapping package="entity">  

    <class name="Room">

       <id name="roomId">

            <generator class="native"/>

       </id>

       <property name="brand"/>

       <property name="state"/>

       <property name="floor"/>

       <property name="goodPrice"/>

       <!-- fetch设置级联查询,查询语句使用级联查询 --> 

       <many-to-one name="roomType"column="typeid" lazy="false"fetch="join" update=”false”></many-to-one>

       <!-- 客房对应图片的一对多关系 -->

       <set name="pics"lazy="false" cascade="none">

         <key column="rmId"/>        <!--//指定副表的外键   -->

         <one-to-many class="Pic"/>   <!--//指定副表的类   -->

       </set> 

      </class>

</hibernate-mapping>

所以不能在money-to-one中设置update=false”属性

上面Room.hbm.xml文件中还存在另外一种关系,

客房-客房图片是一对多的关系

我在设计实体类映射文件的时候加上了这个多对一的属性,在以后查询到客房信息的时候就连客房图片一起加载出来,会比较方便一点

在修改客房信息的时候,并没有对客房图片进行操作,但是客房图片中保存的客房的外键会自动被置空,就是对客房操作时影响到客房图片表了

如下面:在一对多关心中加上inverse=true属性就不会产生这种影响了

<!-- 客房对应图片的一对多关系 -->

       <set name="pics"lazy="false" cascade="delete"inverse="true">  

         <key column="rmId"/>        <!--//指定副表的外键   -->

         <one-to-many class="Pic"/>   <!--//指定副表的类   -->

       </set>

inverse是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse=”true”表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。

   one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。

   注: 配置成one-to-one的对象不维护关联关系

  相关解决方案