zoukankan      html  css  js  c++  java
  • hibernate级联删除

    一对多的双向关联:user对应多个order

    user.xml:

    <class name="com.examp.ShoppingOnline.User"
                table="user"
                discriminator-value="C">            
               <id name="id">
                 <generator class="increment"/>
            </id>
            <property name="username"/>
            <property name="password"/>
            <property name="realname"/>
            <property name="tel"/>
            <property name="address"/>
            <property name="zip"/>
            <property name="email"/>
            <set name="orders" table="orders" cascade="all" inverse="true">
                <key column="user_id"/>
                <one-to-many class="Order"/>
            </set>
        </class>

    order.xml:

    <class name="com.examp.ShoppingOnline.Order"
                table="orders"
                discriminator-value="C">      
            <id name="id">
                   <generator class="increment"/>
            </id>
            <property name="orderno"/>
               <property name="realname"/>
            <property name="address"/>
            <property name="zip"/>
            <property name="tel"/>
            <property name="payment"/>
            <property name="email"/>
            <property name="memo"/>
            <property name="price"/>
            <property name="time"/>
            <property name="tag"/>
            <many-to-one name="user" class="User" column="user_id" cascade="all"/>
         </class>

    注意如果一的那方不加inverse="true",增,更可以正常,但删除会引起错误。

    Hibernate中的inverse在表关系映射中经常应用,
      inverse的值有两种,“true”和“false”。inverse="false"是默认的值,如果设置为true 则表示对象的状态变化不会同步到数据库 ;设置成false则相反;
      inverse的作用:在hibernate中是通过inverse的设置来决定是有谁来维护表和表之间的关系的。
      我们说inverse设立不当会导致性能低下,其实是说inverse设立不当,会产生多余重复的SQL语句甚至致使JDBC exception的throw。这是我们在建立实体类关系时必须需要关注的地方。一般来说,inverse=true是推荐使用,双向关联中双方都设置 inverse=false的话,必会导致双方都重复更新同一个关系。但是如果双方都设立inverse=true的话,双方都不维护关系的更新,这也是 不行的,好在一对多中的一端:many-to-one默认是inverse=false,避免了这种错误的产生。但是多对多就没有这个默认设置了,所以很 多人经常在多对多的两端都使用inverse=true,结果导致连接表的数据根本没有记录,就是因为他们双分都没有责任维护关系。所以说,双向关联中最 好的设置是一端为inverse=true,一端为inverse=false。一般inverse=false会放在多的一端,那么有人提问了, many-to-many两边都是多的,inverse到底放在哪儿?其实hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一 个连接表。所以通用存在一对多的关系,也可以这样说:一对多是多对多的基本组成部分。

      cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。
      inverse只对set+one-to-many(或many-to-many)有效,对many-to-one, one-to-one无效。cascade对关系标记都有效。
      inverse对集合对象整体起作用,cascade对集合对象中的一个一个元素起作用,如果集合为空,那么cascade不会引发关联操作。

      

    所以要是在User.hbm.xml没设置inverse的话,它默认的是false,那么它就会把级联关系刷新,因为user_id是在

    order表中设置,所以会出现user_id=null,所以会报错。

    当在User.hbm.xml设置 inverse="true",它就不会再去更新级联关系,就可以直接进入数据库层面操作数据,所以上面删除用户时同时也把有级联关系的文章删掉了。

  • 相关阅读:
    .vsdx 在线查看 省的安装 visio 2013了
    桌面整理工具 rolan
    第一节、ES6的开发环境搭建
    $("[lay-id='"+this.id+"']")
    mathAge.call(btn) 函数call 改变函数内 this #js
    viewer && ImageFlow 图片滚动组件 图片点击放大 可以滚轮放大缩小 viewer
    ie11 突然不能加载外部css 很神奇 头部改为 <!DOCTYPE> <html>
    CODE[VS] 1219 骑士游历
    CODE[VS] 1169 传纸条
    CODE[VS] 1010 过河卒
  • 原文地址:https://www.cnblogs.com/tuifeideyouran/p/3941879.html
Copyright © 2011-2022 走看看