一、概念
在領(lǐng)域模型中,類與類之間最普遍的關(guān)系就是關(guān)聯(lián)關(guān)系。
在 UML 中幢哨,關(guān)聯(lián)是有方向的:
以 Customer 和 Order 為例: 一個(gè)用戶能發(fā)出多個(gè)訂單,而一個(gè)訂單只能屬于一個(gè)客戶嫂便;從 Order 到 Customer 的關(guān)聯(lián)是多對(duì)一關(guān)聯(lián)捞镰,而從 Customer 到 Order 是一對(duì)多關(guān)聯(lián)。
二毙替、單向 n-1
單向 n-1 關(guān)聯(lián)只需從 n 的一端可以訪問 1 的一端
域模型:從 Order 到 Customer 的多對(duì)一單向關(guān)聯(lián)需要在Order 類中定義一個(gè) Customer 屬性岸售,而在 Customer 類中無需定義存放 Order 對(duì)象的集合屬性。
關(guān)系數(shù)據(jù)模型:ORDERS 表中的 CUSTOMER_ID 參照 CUSTOMER 表的主鍵厂画。
顯然無法直接用 property 映射 customer 屬性凸丸,Hibernate 使用 元素來映射多對(duì)一關(guān)聯(lián)關(guān)系。
<many-to-one>元素來映射組成關(guān)系
name: 設(shè)定待映射的持久化類的屬性的名字
column: 設(shè)定和持久化類的屬性對(duì)應(yīng)的表的外鍵
class:設(shè)定待映射的持久化類的屬性的類型
三袱院、案例
異常情況:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near Order...........
原因:使用了數(shù)據(jù)庫的關(guān)鍵字才導(dǎo)致了該異常的產(chǎn)生屎慢。?
(1)Customer.java
(2)Orders.java,這里不要用Order
(3)Customer.hbm.xml
(4)Orders.hbm.xml
(5)hibernate.cfg.xml
(6)執(zhí)行一下忽洛,生成數(shù)據(jù)庫
(7)插入數(shù)據(jù)
先插入Customer腻惠,再插入Order,3條insert語句欲虚;也就是先插入 1 的一端集灌,再插入 n 的一端,只有insert語句
先插入Order苍在,再插入Customer绝页,3條insert語句,2條update語句寂恬;也就是先插入 n 的一端续誉,再插入 1 的一端,會(huì)多出update語句初肉。
(8)若查詢多的一端的的一個(gè)對(duì)象酷鸦,則默認(rèn)情況下,只查詢了多的一端的對(duì)象牙咏,而沒有查詢關(guān)聯(lián)的 1 的那一端的對(duì)象臼隔!
(9)在需要使用到關(guān)聯(lián)的對(duì)象時(shí),才發(fā)送對(duì)應(yīng)的SQL語句
(10)在查詢Customer對(duì)象時(shí)妄壶,由多的一端導(dǎo)航到 1 的一端時(shí)摔握,若此時(shí)session已關(guān)閉,則默認(rèn)情況下會(huì)發(fā)生LazyInitializationException異常丁寄,
(11)執(zhí)行修改操作
(12)執(zhí)行刪除操作:
在不設(shè)定級(jí)聯(lián)關(guān)系的情況下氨淌,且 1 的一端的對(duì)象有 n 的對(duì)象在引用,不能直接刪除 1 這一端的對(duì)象