hibernate一對多

  1. 什麼是關聯(association)
    1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義爲類A的屬性。例如:
    public class A{
    private B b = new B;
    public A(){}
    }
    1.2 關聯的分類:關聯可以分爲一對一、一對多/多對一、多對多關聯
    關聯是有方向的

    訂單表、訂單項表
    select * from t_order t,t_orderItem m where t.oid = m.oid
    and …

    class Order{
    private STIRNG OID;

    private Set OrderItems;
    }

    session.get(Order.class,1)
    調用此方法
    將關聯屬性自動賦值。

#關鍵點都在數據庫中的外鍵上面,請好好理解下面這二句SQL和一對多及多對一的關係
#select * from Orders where cid=? //這條SQL返回客戶對應的0-n個訂單
#select * from Customers where customerId=? //這條SQL返回訂單對應的1個客戶
#通過這二條SQL不難看出,外鍵在這裏有二個用途:查找客戶的訂單,查找訂單對應的客戶
2. 案例:如何建立客戶和訂單一對多雙向關聯
2.1 先不建立客戶和訂單的關聯關係,定義實體及映射文件,單獨執行保存操作
2.2 建立客戶到訂單的一對多關聯關係



2.3 建立訂單到客戶的多對一關聯關係

  <!--1.註釋 2.只讀-->
  <property name="cid" type="java.lang.Integer" column="cid" insert="false" update="false">
  </property>

2.4 注意:在Hibernate當中定義實體對象的集合屬性時,只能使用接口而不能使用類

#insert屬性設置中主控方概念理解:
3. 以客戶和訂單的一對多雙向關聯爲例,講解Set元素中的cascade|inverse|outter-join|lazy屬性作用
3.1 lazy:默認值爲true,true延遲加載,false立即加載(一般設置爲true,不使用立即加載,因爲影響查詢性能)
3.2 outter-join:默認值爲false,true使用左外聯接查詢關聯的(但一般不用,因爲當我們把該屬性設置爲true時,所有的查詢語句都會默認左外聯,那樣性能不高)
3.3 inverse:默認值爲false,true表示將對方設置爲主控方(一對多雙向關聯中一般將多方設置爲主控方,這樣可以減少SQL語句的數量,減少多餘的操作)
3.4 cascade:用來控制如何操作關聯的持久化對象的
3.4.1 none:保存,更新或刪除當前對象時,忽略其它關聯的對象
3.4.2 save-update:保存、更新時級聯保存所有的臨時對象,並且級聯更新關聯的遊離對象
3.4.3 delete:通過session的delete方法刪除當前對象,級聯刪除關聯的對象
3.4.4 all:等於save-update操作+delete操作

小結:
多方的CRUD與沒有建立關聯關係之前的操作一致
一方的CRUD與沒有建立關聯關係之前的操作有變化
D:刪除一方之前先刪除多方
C:級聯操作
R:代碼控制多方

  1. 案例:菜單對象的一對多雙向自關聯

  2. 如何將多方映射成一個有序的集合

    核心
    訂單表、訂單項

級聯新增
外鍵處理的三種方式
1、刪除從表對應的實體類中的外鍵屬性
2、在配置的xml中外鍵屬性上添加 insert=false,update=false的設置。
3、在配置的xml中的manyToOne標籤中添加insert=false,update=false的設置。
級聯新增 casecade=save-update 介紹

級聯查詢
配置文件介紹以及後臺sql的形成過程
級聯查詢時的問題
Lazy=true介紹 查單個時存在問題
Lazy=false介紹 查所有時存在問題
解決方案:通過字段控制,強制加載。Hibernate.initialize()

普通刪除
Order
Add 講外鍵的處理
Get/list order.getOrderItems.size講懶加載的處理,sql形成過程
Del 將關係的處理中的刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章