国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java 中的父子關系及 inverse 詳解

2019-11-18 13:16:29
字體:
來源:轉載
供稿:網友

  首先以父子關系為例:
  
  <
  
  對應生成的DDL drop table PARENT;
  代碼:
  drop table CHILD;
  create table PARENT (ID INTEGER not null generated by default as identity, PRimary key (ID));
  create table CHILD (ID INTEGER not null generated by default as identity, PARENTID INTEGER, primary key (ID));
  alter table CHILD add constraint FK3D1FCFC74B18345 foreign key (PARENTID) references PARENT; 
  
  *大寫的部分inverse="true"表示 ParentPO 本身不維護表之間的關系!,而由想反的一方 children來維護,
  
  *CASCADE=“ALL”表示 無論是update,insert ,delete 都保持幾連關系
  
  *lazy="true"表示初始化父親的時候不會把所有的兒子都從數據庫中load進來。
  
  下面先看一下幾個例子:
  
  生成的SQL:
  
  代碼:
  Hibernate: insert into PARENT (ID) values (default)
  Hibernate: insert into CHILD (PARENTID, ID) values (?, default)
  Hibernate: insert into CHILD (PARENTID, ID) values (?, default) 
  
  結果 C:/Myapp/SQLLIB/BIN>db2 select * from child
  
  代碼:
  ID     PARENTID
  ----------- -----------
       71     44
       72     44
       73     44
  C:/Myapp/SQLLIB/BIN>db2 select * from parent
   
  ID
  -----------
       44
   
  注重之只有一句:session.save(parent);就把兩個兒子保存進了數據庫。
  
  *首先講講inverse=true作用: 這里關系是由兒子維護的,所以假如只是往父親里加入兒子,不給兒子設置父親的話session.save(parent),就不會保存兒子! 看這個例子:注重與例子1的對比
  
  代碼:
  *ChildPO child = new ChildPO(parent)---〉ChildPO child = new ChildPO(),
  
          ITxMgr tx = null;
          tx = HibernateTxMgr.beginTrans("Add a new relationsh          session = (Session) tx.getSession();
          parent = new ParentPO();
          ChildPO child = new ChildPO();
          ChildPO child2 = new ChildPO();
          List list = new ArrayList();
          list.add(child);
          list.add(child2);
          parent.setChildren(list);
          session.save(parent);
          session.flush();
          System.out.println("dddddddddddddddddddddddddddddddddddddddddddddddddddddd") ;
          ChildPO child3 = new ChildPO();
          child3.setParent(parent);
          session.save(child3);
          session.flush();
          System.out.println("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") ;
          tx.endTrans(); 
  
  生成的SQL沒有變
  
  代碼:
  Hibernate: insert into PARENT (ID) values (default)
   
  Hibernate: insert into CHILD (PARENTID, ID) values (?, default)
   
  Hibernate: insert into CHILD (PARENTID, ID) values (?, default)
   
  dddddddddddddddddddddddddddddddddddddddddddddddddddddd
  Hibernate: insert into CHILD (PARENTID, ID) values (?, default)
  eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 
  
  *注重父子關系丟失了 C:/Myapp/SQLLIB/BIN>db2 select * from child
  
  代碼:
  ID     PARENTID
  ----------- -----------
       74      -
       75      -
       76     45
  C:/Myapp/SQLLIB/BIN>db2 select * from parent
   
  ID
  -----------
       45 
  
  *為什么最后一個孩子的父親沒有丟失呢? 就在于child3.setParent(parent);,所以關系是由孩子維護的,假如child不setParent,或者 new childPO(父親)的話 父子關系就丟失了,parent.setChildren(list);是沒有用的!
  *這里就又引入了另外一個問題為什么要用inverse? 用了它維護關系起豈不是很麻煩?,這里給出個例子給大家一個解釋:(要害原因在于性能)
  
  下面這個例子和例子一完全一樣,所差的就是沒有用inverse=true
  
  例子2:
  
  代碼:
  hibernate-mapping>
    <class name="com.etech.bm.po.ChildPO" table="CHILD">
          <id name="id" column="ID" type="integer">
              <generator class="identity"/>
          </id>
      <many-to-one name="parent" class="com.etech.bm.po.ParentPO" column="PARENTID"/>
    </class>
    <class name="com.etech.bm.po.ParentPO" table="PARENT">
          <id name="id" column="ID" type="integer">
              <generator class="identity"/>
          </id>
      <bag name="children" CASCADE=“ALL”>
          <key column="PARENTID"/>
          <one-to-many class="com.etech.bm.po.ChildPO"/>
      </bag>
    </class>
   
  </hibernate-mapping> 
  
  代碼:
  drop table PARENT;
  drop table CHILD;
  create table PARENT (ID INTEGER not null generated by default as identity, primary key (ID));
  create table CHILD (ID INTEGER not null generated by default as identity, PARENTID INTEGER, primary key (ID));
  alter table CHILD add constraint FK3D1FCFC74B18345 foreign key (PARENTID) references PARENT; 
  
  代碼:
  ITxMgr tx = null;
          tx = HibernateTxMgr.beginTrans("Add a new relationships...");
          session = (Session) tx.getSession();
          parent = new ParentPO();
          ChildPO child = new ChildPO(parent);
          ChildPO child2 = new ChildPO(parent);
          List list = new ArrayList();
          list.add(child);
          list.add(child2);
          parent.setChildren(list);
          session.save(parent);
          session.flush();
          System.out.println("dddddddddddddddddddddddddddddddddddddddddddddddddddddd") ;
          ChildPO child3 = new ChildPO();
          child3.setParent(parent);
          session.save(child3);
          session.flush();
          System.out.println("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") ;
          tx.endTrans();  
  
  hibernate 生成的sql Hibernate: insert into PARENT (ID) values (default)
  
  代碼:
  Hibernate: insert into CHILD (PARENTID, ID) values (?, default)
   
  Hibernate: insert into CHILD (PARENTID, ID) values (?, default)
   
  Hibernate: update CHILD set PARENTID=? where ID=?
  dddddddddddddddddddddddddddddddddddddddddddddddddddddd
  Hibernate: insert into CHILD (PARENTID, ID) values (?, default)
  Hibernate: values IDENTITY_VAL_LOCAL() 
  
  結果 C:/Myapp/SQLLIB/BIN>db2 select * from parent
  
  代碼:
  ID
  -----------
       46
  ID     PARENTID
  ----------- -----------
       77     46
       78     46
       79     46 
  
  明顯比原來多了一句Hibernate: update CHILD set PARENTID=? where ID=?針對每一個孩子都去更新父親的id明顯速度很慢,因為父親有個孩子的集合,他無法知道哪個孩子的父親id已經指向自己了,所以對于每一個孩子,都要更新父親使他只想自己,而這個關系由孩子維護就好多了,每個孩子只有一個父親,只有設置過的才需要更新,所以顯然,這個父子關系由孩子來維護比較省力.減輕了數據庫的負擔
  
  *現在我們再來看看在沒有 inverse=true 的條件下 ChildPO child = new ChildPO(parent)---〉ChildPO child = new ChildPO(),
  
  
  代碼:
  ITxMgr tx = null;
          tx = HibernateTxMgr.beginTrans("Add a new relationships...");
          session = (Session) tx.getS

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴城市| 余干县| 扎兰屯市| 司法| 沂源县| 普定县| 公安县| 木里| 万载县| 樟树市| 民和| 九江县| 微山县| 沽源县| 扬州市| 四子王旗| 高密市| 克拉玛依市| 巴林左旗| 岑巩县| 望奎县| 民丰县| 吉林市| 三门峡市| 中西区| 叶城县| 峨山| 岐山县| 梁河县| 同心县| 柳州市| 郧西县| 阿合奇县| 区。| 磐石市| 长寿区| 甘南县| 莎车县| 台江县| 息烽县| 莎车县|