Java:hibernate框架(3)

一. 表與表之間的關系

1. 一對多的關系:  一對多建表,通過外鍵建立關系.

2.多對多的關系:  多對多建表,通過第三張表建立關系.

二.Hibernate的一對多操作
1.一對多映射配置

以客戶和聯(lián)系人為例:  客戶為一,聯(lián)系人是多;
第一步:   創(chuàng)建兩個實體類: Customer類即客戶類  和 LinkMan類即聯(lián)系人類,其中Customer類表示一 ,LinkMan類表示多;

第二步:  讓兩個實體類之間相互表示;
(1)在客戶實體類里面表示多個聯(lián)系人

//在客戶實體類里面表示多個聯(lián)系人秘通,一個客戶有多個聯(lián)系人
//hibernate要求使用集合表示多的數(shù)據(jù)为严,使用set集合
private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();
public Set<LinkMan> getSetLinkMan() { 
  return setLinkMan;
}
public void setSetLinkMan(Set<LinkMan> setLinkMan) {
   this.setLinkMan = setLinkMan;
}

(2)在聯(lián)系人類里面表示所屬客戶

// 在聯(lián)系人實體類里面表示所屬客戶,一個聯(lián)系人只能屬于一個客戶
private Customer customer;
public Customer getCustomer() {
   return customer;
}
public void setCustomer(Customer customer) {
   this.customer = customer;
}

第三步:  配置映射關系
(1) 一般一個實體類對應一個映射文件
(2) 在映射文件中,配置一對多關系
Customer類的配置文件的內(nèi)容
<hibernate-mapping>
    <!--        配置類和表對應
        class標簽
        name屬性: 實體類的全路徑
        table屬性: 數(shù)據(jù)表的名稱    -->
    <class name="com.company.Customer" table="customer">
        <id name="cid" column="cid">
            <!--設置數(shù)據(jù)表id增長策略-->
            <generator class="native"></generator>
        </id>
        <property name="custName" column="custName"></property>
        <property name="custLevel" column="custLevel"></property>
        <property name="custSource" column="custSource"></property>
        <property name="custPhone" column="custPhone"></property>
        <property name="custMobile" column="custMobile"></property>
        <!--   在客戶映射文件中,表示所有聯(lián)系人
            使用set標簽表示所有聯(lián)系人
            set標簽里面有name屬性:Set集合的對象
            inverse 屬性: 取消一對外鍵的操作        -->
        <set name="setLinkMan" cascade="save-update,delete" inverse="true">
            <!-- 一對多建表,有外鍵
                 hibernate機制: 雙向維護外鍵,在一和多那一方都配置外鍵
                 column屬性值: 外鍵名稱             -->
            <key column="cid"></key>
            <!--客戶所有人的聯(lián)系人,class里面寫聯(lián)系人實體類全路徑-->
            <one-to-many class="com.company.LinkMan"></one-to-many>
        </set>
    </class>
</hibernate-mapping>

2.一對多級聯(lián)保存

public void TestGave1() {
    SessionFactory sessionFactory = null;
    Session session = null;
    Transaction tx = null;
    try {
        //得到SessionFactory對象
        sessionFactory = HibernateUtils.getSessionFactory();
        //得到session
        session = sessionFactory.openSession();
        //開啟事務
        tx = session.beginTransaction();
        //添加一個客戶,為這個客戶添加一個聯(lián)系人
        //1.創(chuàng)建客戶和聯(lián)系人對象
        Customer customer = new Customer();
        customer.setCustName("百度");
        customer.setCustLevel("普通客戶");
        customer.setCustSource("網(wǎng)絡");
        customer.setCustPhone("110");
        customer.setCustMobile("999");

        LinkMan linkMan = new LinkMan();
        linkMan.setLkm_name("小宏");
        linkMan.setLkm_gender("男");
        linkMan.setLkm_phone("911");

        //2.把聯(lián)系人放到客戶里面
        <!-- 簡便方法:
             1. 在Customer配置文件中的set標簽中添加cascade屬性,值為: save-update
             這樣配置之后,就可以省略linkMan 的 setCustomer方法 和 session.save(linkMan) 方法
         -->
        customer.getSetLinkMan().add(linkMan); 
        // linkMan.setCustomer(customer);

        //3.保存客戶
        session.save(customer);
       //session.save(linkMan);

        //提交事務
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
    } finally {
        session.close();
        sessionFactory.close();
    }
}

3.一對多的級聯(lián)刪除

public void TestDelete() {
    SessionFactory sessionFactory = null;
    Session session = null;
    Transaction tx = null;
    try {
        //得到SessionFactory對象
        sessionFactory = HibernateUtils.getSessionFactory();
        //得到session
        session = sessionFactory.openSession();
        //開啟事務
        tx = session.beginTransaction();

        //添加一個客戶,為這個客戶添加一個聯(lián)系人
        //1.根據(jù)id查詢到客戶對象
        Customer customer = session.get(Customer.class, 3);
        //2.調(diào)用方法刪除
        session.delete(customer);

        //提交事務
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
    } finally {
        session.close();
        sessionFactory.close();
    }
}

4.一對多級聯(lián)修改

public void TestUpdate() {
    SessionFactory sessionFactory = null;
    Session session = null;
    Transaction tx = null;
    try {
        //得到SessionFactory對象
        sessionFactory = HibernateUtils.getSessionFactory();
        //得到session
        session = sessionFactory.openSession();
        //開啟事務
        tx = session.beginTransaction();

        //1. 根據(jù)id查詢百度的客戶
        Customer baidu = session.get(Customer.class,1);
        //2.根據(jù)id查詢聯(lián)系人
        LinkMan linkMan = session.get(LinkMan.class,2);
        //設置持久態(tài)的值
        baidu.getSetLinkMan().add(linkMan);
        //把客戶放到聯(lián)系人里面
        linkMan.setCustomer(baidu);

        //提交事務 
       tx.commit();
    } catch (Exception e) {
        tx.rollback();
    } finally {
        session.close();
        sessionFactory.close();
    }
}

注: inverse屬性
1.因為hibernate是雙向維護,在客戶和聯(lián)系人里面都需要維護外鍵,修改客戶的時候修改一次外鍵,造成效率問題
2.解決方案: 在Customer配置文件中的set標簽中添加inverse屬性,屬性值: true
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肺稀,隨后出現(xiàn)的幾起案子第股,更是在濱河造成了極大的恐慌,老刑警劉巖话原,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夕吻,死亡現(xiàn)場離奇詭異,居然都是意外死亡繁仁,警方通過查閱死者的電腦和手機涉馅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黄虱,“玉大人稚矿,你說我怎么就攤上這事∧砥郑” “怎么了晤揣?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長朱灿。 經(jīng)常有香客問我碉渡,道長,這世上最難降的妖魔是什么母剥? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任滞诺,我火速辦了婚禮,結果婚禮上环疼,老公的妹妹穿的比我還像新娘习霹。我一直安慰自己,他們只是感情好炫隶,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布淋叶。 她就那樣靜靜地躺著,像睡著了一般伪阶。 火紅的嫁衣襯著肌膚如雪煞檩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天栅贴,我揣著相機與錄音斟湃,去河邊找鬼。 笑死檐薯,一個胖子當著我的面吹牛凝赛,可吹牛的內(nèi)容都是我干的注暗。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼墓猎,長吁一口氣:“原來是場噩夢啊……” “哼捆昏!你這毒婦竟也來了?” 一聲冷哼從身側響起毙沾,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤骗卜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后左胞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寇仓,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年罩句,在試婚紗的時候發(fā)現(xiàn)自己被綠了焚刺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡门烂,死狀恐怖乳愉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屯远,我是刑警寧澤蔓姚,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站慨丐,受9級特大地震影響坡脐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜房揭,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一备闲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捅暴,春花似錦恬砂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梧奢,卻和暖如春狱掂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亲轨。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工趋惨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓶埋。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓希柿,卻偏偏與公主長得像诊沪,于是被迫代替她去往敵國和親养筒。 傳聞我的和親對象是個殘疾皇子曾撤,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1.表關系 1.1 數(shù)據(jù)表基本知識 首先來回顧一下數(shù)據(jù)庫的基本知識。 主鍵:數(shù)據(jù)表中能夠唯一標識一條記錄的字段或者...
    Wizey閱讀 460評論 0 0
  • 1. Java基礎部分 基礎部分的順序:基本語法晕粪,類相關的語法挤悉,內(nèi)部類的語法,繼承相關的語法巫湘,異常的語法装悲,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 上篇文章我們對持久化對象進行的學習,了解了它的三種不同的狀態(tài)并通過它完成對數(shù)據(jù)庫的映射操作尚氛。但這都是基于單張表的操...
    Single_YAM閱讀 500評論 0 1
  • 集合映射 開發(fā)流程:需求分析/數(shù)據(jù)庫設計诀诊、項目設計/ 編碼/測試/實施部署上線/驗收 需求 : 用戶購買, 填寫地...
    奮斗的老王閱讀 921評論 0 51
  • 人為什么一生下來就一定會哭呢阅嘶?可能他知道來到世上就注定要受苦属瓣,人生短短幾十年一扎眼就過去了。好也是要過完一輩子讯柔,壞...
    章改變閱讀 802評論 0 0