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的对象不维护关联关系