初識(shí)Hibernate之關(guān)聯(lián)映射(一)

?????上篇文章我們對持久化對象進(jìn)行的學(xué)習(xí),了解了它的三種不同的狀態(tài)并通過它完成對數(shù)據(jù)庫的映射操作裙犹。但這都是基于單張表的操作,如果兩張或者兩張以上的表之間存在某種關(guān)聯(lián)践图,我們又該如何利用持久化對象進(jìn)行操作呢码党?本篇主要介紹的關(guān)聯(lián)映射就是針對有著某種關(guān)聯(lián)的多張表的各種操作斥黑,主要涉及內(nèi)容如下:

  • 組合主鍵的映射
  • 組件的映射
  • 單向多對一的映射
  • 單向一對多的映射
  • 雙向一對多的映射
  • 級(jí)聯(lián)映射

一锌奴、組合主鍵的映射操作
?????根據(jù)我們的上篇文章,對于單一主鍵箕慧,在對象映射配置文件中使用 id標(biāo)簽即可完成配置颠焦。但是琐簇,往往有些主鍵并不是單一的婉商,它可能由多個(gè)字段組合丈秩,那么此時(shí)就不能使用 id標(biāo)簽進(jìn)行指定了淳衙。例如箫攀,我們有一張scores表,該表有三個(gè)字段缀雳,uid表示學(xué)生id肥印,sub表示學(xué)生考試的學(xué)科,score表示該門考試成績腹鹉。那么確定一個(gè)學(xué)生的某門考試成績就需要uid和usub功咒,此時(shí)它們就是scores表的主鍵绞蹦,因?yàn)樗芪ㄒ淮_定一行數(shù)據(jù)坦辟。

/*定義scores實(shí)體類*/
public class Scores {
    private Score scoreId;    //主鍵
    private int score;
    //省略get锉走,set方法
}
public class Score implements Serializable {
    private int userId;
    private String sub;
    //省略get,set方法
}

在這里亭饵,我們定義scores實(shí)體類辜羊,我們將主鍵封裝成一個(gè)類score八秃,該類必須繼承接口Serializable 肉盹,最好還能實(shí)現(xiàn)它的兩個(gè)方法equals和hashcode上忍。然后就是我們的實(shí)體映射配置文件的編寫:

<class name="DbClasses.Scores" table="scores">
    <composite-id name="scoreId" class="DbClasses.Score">
        <key-property name="userId" column="userId"></key-property>
        <key-property name="sub" column="sub"></key-property>
    </composite-id>
    <property name="score" column="score"></property>
</class>

對于組合主鍵窍蓝,我們使用標(biāo)簽composite-id來配置,name和class屬性分別指定主鍵類在實(shí)體類中的名稱及其位置淑玫。該標(biāo)簽下的key-property標(biāo)簽則是用來指定主鍵成員對應(yīng)于數(shù)據(jù)表中的具體字段的混移。我們運(yùn)行程序歌径,看看Hibernate為我們創(chuàng)建的表中是否有一個(gè)組合主鍵:

這里寫圖片描述

顯然回铛,在我們的scores表中,userId和sub的組合構(gòu)成了該表的主鍵腔长。這就是組合主鍵在Hibernate中的配置情況捞附,組合主鍵還是比較常見的士袄。

二了牛、組件映射
?????這里將要介紹的組件映射和上述介紹的主鍵映射名稱相似,但確實(shí)完全不同的概念跟继,需要予以區(qū)別舔糖。假設(shè)我們有一張person表:

這里寫圖片描述

person表中有主鍵id剩盒,name慨蛙,age字段期贫,還有三個(gè)地址字段(往往一個(gè)人有多個(gè)地址通砍,我們要分別進(jìn)行保存)。但是這樣的一個(gè)表結(jié)構(gòu)對應(yīng)于我們的實(shí)體類如下:

public class Person {
    private int id;
    private String name;
    private int age;
    private String address1;
    private String address2;
    private String address3;
    //省略get迹冤,set方法
}

對于這樣的實(shí)體類來說泡徙,我們覺得他對于地址字段的處理是冗余的堪藐,假如某個(gè)人有十個(gè)地址挑围,難道要在我們的實(shí)體類中配置十個(gè)屬性嗎杉辙?顯然是不合理的蜘矢,Hibernate允許我們像主鍵映射一樣將所有的地址字段抽象出來一個(gè)類。

public class Person {
    private int id;
    private String name;
    private int age;
    private Address address;
    //省略get并淋,set方法
}
public class Address {
    private String address1;
    private String address2;
    private String address3;
    //省略get县耽,set方法
}

重點(diǎn)在于我們的實(shí)體映射文件的配置兔毙,

<class name="DbClasses.Person" table="person">
    <id name="id" column="id">
        <generator class="native"></generator>
    </id>
    <property name="name" column="name"></property>
    <property name="age" column="age"></property>
    <!--映射的一個(gè)組件屬性-->
    <component name="address" class="DbClasses.Address">
        <property name="address1" column="address1"></property>
        <property name="address2" column="address2"></property>
        <property name="address3" column="address3"></property>
    </component>
</class>

實(shí)體類中其他的屬性照常配置澎剥,對于這個(gè)Address類型的屬性哑姚,我們使用component標(biāo)簽進(jìn)行配置芜茵,name和class分別指定組件名和其位置九串,在該標(biāo)簽下,使用property標(biāo)簽配置組件的成員對應(yīng)于數(shù)據(jù)表中的字段胆建。然后我們刪除表肘交,重新看看這次Hibernate為我們生成的表結(jié)構(gòu):

這里寫圖片描述

顯然結(jié)果是一樣的酸些,我們使用組件映射的一個(gè)好處就在于在這個(gè)實(shí)體類中魄懂,對于數(shù)據(jù)表結(jié)構(gòu)顯得非常清晰市栗,代碼的封裝性更好,方便查錯(cuò)蛛淋。

三褐荷、單向多對一的映射
?????以上介紹的兩種基本映射并不屬于我們本篇將要介紹的關(guān)聯(lián)映射叛甫,關(guān)聯(lián)映射就是指在處理多張有關(guān)聯(lián)的表時(shí)杨伙,我們的實(shí)體類的配置限匣。所謂的多對一就是指米死,其中一張表的主鍵是另一張表的外鍵辩涝,例如:

這里寫圖片描述

我們有一張Student表,一張grade表商膊,其中g(shù)rade表的主鍵id是Student表的外鍵(grade)晕拆,Student中的多條記錄對應(yīng)于grade的一條記錄材蹬,所以這種表的關(guān)聯(lián)又被稱作多對一的關(guān)聯(lián)關(guān)系堤器。下面我們看看如何通過對實(shí)體類的配置達(dá)到構(gòu)建這種多對一的數(shù)據(jù)表關(guān)聯(lián)闸溃。

public class Student {
    private int uId;
    private String name;
    private int age;
    private Grade grade;
    //省略get辉川,set方法
}
public class Grade {
    private int id;
    private String grade;
    //省略get乓旗,set方法
}

Student和Grade分別對應(yīng)不同數(shù)據(jù)庫表的兩個(gè)實(shí)體類,但是Student實(shí)體類中有一個(gè)屬性grade指向?qū)嶓w類Grade汇跨。實(shí)體類映射配置文件如下:

<class name="DbClasses2.Student" table="student">
    <id name="uId" column="uid">
         <generator class="native"></generator>
    </id>
    <property name="name"></property>
    <property name="age"></property>
    <many-to-one name="grade" class="DbClasses2.Grade" column="grade_id"></many-to-one>
</class>

<class name="DbClasses2.Grade" table="grade">
    <id name="id" column="id">
        <generator class="native"></generator>
    </id>
    <property name="grade" column="grade"></property>
</class>

Grade實(shí)體類的配置沒什么變化,Student中使用many-to-one標(biāo)簽將本實(shí)體類中屬性grade配置指向另一個(gè)實(shí)體類Grade塞颁,并用column指定外鍵名稱吸耿。也就是當(dāng)Hibernate根據(jù)映射配置文件創(chuàng)建數(shù)據(jù)表的時(shí)候咽安,發(fā)現(xiàn)屬性grade指向的是一個(gè)實(shí)體類Grade妆棒,于是把Grade表的主鍵關(guān)聯(lián)到grade字段上。我們先運(yùn)行程序看看HIbernate是否為我們創(chuàng)建了這種外鍵關(guān)聯(lián)毅糟,然后通過插入數(shù)據(jù)進(jìn)一步理解Hibernate在底層為我們做的事情姆另。

這里寫圖片描述

顯然迹辐,在分別創(chuàng)建Student和Grade表之后明吩,Hibernate又向數(shù)據(jù)庫發(fā)送了一條alter語句渺绒,該語句負(fù)責(zé)添加外鍵關(guān)聯(lián)宗兼。下面我們看看能否利用外鍵獲取到Grade表中的成績殷绍。

/*首先向表中插入信息*/
Student student = new Student();
student.setName("single");
student.setAge(21);

Grade grade = new Grade();
grade.setGrade("優(yōu)秀");

student.setGrade(grade);

session.save(grade);
session.save(student);

我們知道主到,一個(gè)實(shí)體類的對象對應(yīng)于數(shù)據(jù)表的一條記錄登钥,那么grade代表Grade表的一條記錄,而該對象作為屬性值被賦值給Student中的grade屬性則表示它將自己的引用交給了Student的外鍵字段看锉,也就是說student這條記錄可以通過外鍵字段找到grade代表的這條記錄伯铣。有點(diǎn)繞腔寡,但是學(xué)過數(shù)據(jù)庫原理的應(yīng)該不難理解。下面我們看掌唾,如何利用外鍵獲取對應(yīng)的Grade表中的一條完整記錄放前。

Student student = (Student)session.get(Student.class,1);
Grade grade = student.getGrade();
System.out.println(grade.getId()+":"+grade.getGrade());

輸出結(jié)果:

1:優(yōu)秀

顯然忿磅,我們通過Student返回的grade對象代表的就是基于Student外鍵字段值在Grade表中的一條數(shù)據(jù)。

四犀斋、單向一對多的映射
?????單向many-to-one關(guān)聯(lián)是最常見的單向關(guān)聯(lián)關(guān)系贝乎,其邏輯也趨近與我們的Sql語言,還算比較好理解叽粹。而對于單向一對多的映射則是其的一個(gè)逆向的邏輯,相對而言比較難以理解虫几。這個(gè)多對一和一對多之間有個(gè)很明顯的區(qū)別,對于多對一的情況挽拔,我們在得到Student對象代表的一條數(shù)據(jù)記錄時(shí)辆脸,可以利用外鍵得到相對應(yīng)Grade表中的一條記錄。但是反過來螃诅,如果我們想知道對于Grade表的某條記錄究竟有多少Student表記錄予以對應(yīng)呢啡氢?起碼這是多對一無法直接解決的,那么我們的一對多則著重解決的就是這么一個(gè)問題术裸。

?????所謂的一對多就是利用一的一方完成這種外鍵關(guān)聯(lián)的構(gòu)建倘是。我們先看實(shí)體類的定義:

/*student實(shí)體類的定義*/
public class Student {
    private int uId;
    private String name;
    private int age;
    //省略get,set方法
}
public class Grade {
    private int id;
    private String grade;
    //用于給其他表映射外鍵
    private Set<Student> students = new HashSet<Student>(0); 
    //省略get袭艺,set方法
}

這里我們使用set集合搀崭,其實(shí)無論是list或者map都是可以的,旨在保存多的一方的記錄猾编×龆茫看似毫無關(guān)聯(lián)的兩張表卻可以通過配置文件完成外鍵關(guān)聯(lián)操作。有關(guān)Student實(shí)體的映射配置部分代碼和平常是一樣的答倡,沒有變動(dòng)此處不再貼出轰传,我們主要看Grade實(shí)體類的映射配置代碼:

<class name="DbClasses2.Grade" table="grade">
    <id name="id" column="id">
        <generator class="native"></generator>
    </id>
    <property name="grade"/>
    <set name="students">
        <key column="grade_id"></key>
        <one-to-many class="DbClasses2.Student"></one-to-many>
    </set>
</class>

在Grade的實(shí)體類映射配置文件中,set標(biāo)簽用于配置屬性students 瘪撇。也就是說获茬,當(dāng)Hibernate加載到這里的時(shí)候,兩張表單獨(dú)創(chuàng)建完成之后设江,我要回到這里來锦茁,這里有一個(gè)一對多的外鍵需要更新,該外鍵的表載體在Student中叉存,外鍵的名稱是grade_id码俩,于是它就會(huì)去更新Student的表結(jié)構(gòu),為它添加外鍵的引用歼捏,而引用的表就是Grade稿存。這里還看不出set的作用笨篷,我們先看Hibernate為我們創(chuàng)建的表關(guān)聯(lián)是否正確,然后通過存取數(shù)據(jù)來感受set的作用瓣履。

這里寫圖片描述

顯然率翅,Hibernate是先單獨(dú)創(chuàng)建兩張表,然后發(fā)送alter語句添加外鍵引用袖迎。那究竟set有什么用呢冕臭?它里面裝的又是什么呢?
假設(shè)兩張表中有如下信息:

這里寫圖片描述

下面我們通過程序獲取成績?yōu)閮?yōu)秀的所有Student燕锥。這一點(diǎn)在多對一映射中是做不到的辜贵。多對一只能知道某個(gè)學(xué)生的成績是什么,但是無法直接知道成績?yōu)槭裁吹乃袑W(xué)生归形。

Grade grade = (Grade)session.get(Grade.class,1);
Set<Student> students = grade.getStudents();
//遍歷輸出所有學(xué)生姓名
Iterator<Student> iterator = students.iterator();
while(iterator.hasNext()){
            System.out.println(iterator.next().getName());
}

輸出結(jié)果:

這里寫圖片描述

從Hibernate的日志輸出中托慨,我們可以很顯然的看出來,首先Hibernate向數(shù)據(jù)庫發(fā)送第一條select語句查詢id為1的grade記錄暇榴,然后默默的又一次發(fā)送select語句厚棵,不過這次是Student表,查詢所有g(shù)rade_id為1的記錄并通過反射全部添加到set集合中蔼紧。于是我們可以遍歷輸出所有Student信息婆硬。

五、雙向一對多的映射
?????雙向一對多或者雙向多對一都是一個(gè)意思歉井,這種形式的關(guān)聯(lián)映射操作就是上述的兩種映射的結(jié)合柿祈,在多的一段配置多對一映射,在一的一段配置一對多映射哩至。這樣躏嚎,我們既可以從多的一端通過外鍵獲取到一的一端的詳細(xì)記錄又可以從一的一端通過自己的主鍵獲取到多的一端的所有對應(yīng)記錄。這種方式比較簡單菩貌,此處不再贅述卢佣,我們最后看看兩個(gè)關(guān)鍵字cascade和inverse的含義和用法。

六箭阶、級(jí)聯(lián)映射
?????我們首先看級(jí)聯(lián)操作虚茶,級(jí)聯(lián)就是在兩張具有關(guān)聯(lián)關(guān)系的表操作的時(shí)候,通過操作其中一張表級(jí)聯(lián)的更新了另一張表仇参。先看個(gè)例子:

<many-to-one name="grade" class="DbClasses2.Grade" column="grade_id" cascade="save-update" />

我們在多的一端配置cascade等于save-update嘹叫,意味著我們在多的一端進(jìn)行save和update的時(shí)候,數(shù)據(jù)會(huì)自動(dòng)更新到Grade表中诈乒。

Student stu1 = new Student();
stu1.setName("single");
stu1.setAge(21);

Grade grade = new Grade();
grade.setGrade("優(yōu)秀");

stu1.setGrade(grade);

//session.save(grade);
session.save(stu1);

上述的這段代碼完成的是一個(gè)插入操作罩扇,如果沒有設(shè)置級(jí)聯(lián)的話,該段程序必然報(bào)錯(cuò),因?yàn)間rade表中無任何數(shù)據(jù)喂饥,而student代表的一條記錄的grade_id的字段卻被強(qiáng)行插入數(shù)值1消约,自然會(huì)報(bào)錯(cuò)(外鍵1在grade表中找不到)。但是我們配置了級(jí)聯(lián)就不一樣了员帮,Hibernate會(huì)先保存grade到數(shù)據(jù)庫中或粮,然后再插入student這條記錄。從Hibernate的輸出日志中也可以看出來:

這里寫圖片描述

當(dāng)然捞高,除了可以在多的一端配置級(jí)聯(lián)氯材,我們也可以在一的一端配置級(jí)聯(lián),讓一的一端也可以級(jí)聯(lián)的操作多的一端硝岗。例如:

<set name="students" cascade="save-update">
      <key column="grade_id"></key>
      <one-to-many class="DbClasses2.Student"></one-to-many>
</set>

給一的一端配置級(jí)聯(lián)浓体,然后我么通過級(jí)聯(lián)來保存多的一端的數(shù)據(jù)。

Grade grade = new Grade();
grade.setGrade("優(yōu)秀");

Student stu1  = new Student();
stu1.setName("single");
stu1.setAge(21);

Student stu2 = new Student();
stu2.setName("cyy");
stu2.setAge(20);

grade.getStudents().add(stu1);
grade.getStudents().add(stu2);

//session.save(stu1);sesion.save(stu2);
session.save(grade);

這段代碼在沒有配置級(jí)聯(lián)的狀態(tài)下辈讶,必然會(huì)報(bào)錯(cuò)。首先Hibernate根據(jù)配置文件創(chuàng)建了兩張表及其之間的關(guān)聯(lián)關(guān)系娄猫。執(zhí)行save的時(shí)候會(huì)將grade保存到數(shù)據(jù)表中贱除,然后Hibernate會(huì)查看自己set集合中對應(yīng)的多端的記錄并根據(jù)這些記錄去更新多端表中的外鍵值,當(dāng)然如果沒有保存到student表中媳溺,自然會(huì)報(bào)錯(cuò)月幌。我們看看級(jí)聯(lián)是怎么做的:

這里寫圖片描述

顯然,在保存好grade之后悬蔽,立馬將自己set集合中的Student記錄插入到Student表中扯躺,然后通過update語句更新他們的外鍵值。而沒有設(shè)置級(jí)聯(lián)的話蝎困,第二三條Sql語句是沒有的录语,報(bào)錯(cuò)那也是自然的。關(guān)于級(jí)聯(lián)禾乘,只要理解了它的本質(zhì)澎埠,這些操作也都是可以理解的,本質(zhì)上就是在做插入或者修改操作的時(shí)候如果發(fā)現(xiàn)自己代表的這條記錄中有外部關(guān)聯(lián)表的內(nèi)容始藕,那么則先完成對外部表的更新蒲稳。這就是級(jí)聯(lián),級(jí)聯(lián)的操作和自己關(guān)聯(lián)的外部表伍派,當(dāng)然cascade也不止這一個(gè)參數(shù)值:

cascade="all|none|save-update|delete"

其中江耀,none表示不級(jí)聯(lián),all表示所有操作都級(jí)聯(lián)诉植,save-update 表示保存和修改操作進(jìn)行級(jí)聯(lián)祥国,delete表示刪除的時(shí)候級(jí)聯(lián)刪除。本質(zhì)都類似倍踪,此處不再贅述系宫。

至此索昂,有關(guān)關(guān)聯(lián)映射的第一部分介紹完了,下篇將繼續(xù)介紹未完的其他關(guān)聯(lián)映射的操作扩借〗凡遥總結(jié)不到之處,望指出潮罪!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末康谆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫉到,更是在濱河造成了極大的恐慌沃暗,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何恶,死亡現(xiàn)場離奇詭異孽锥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)细层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門惜辑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疫赎,你說我怎么就攤上這事盛撑。” “怎么了捧搞?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵抵卫,是天一觀的道長。 經(jīng)常有香客問我胎撇,道長介粘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任创坞,我火速辦了婚禮碗短,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘题涨。我一直安慰自己偎谁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布纲堵。 她就那樣靜靜地躺著巡雨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪席函。 梳的紋絲不亂的頭發(fā)上铐望,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼正蛙。 笑死督弓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乒验。 我是一名探鬼主播愚隧,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锻全!你這毒婦竟也來了狂塘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鳄厌,失蹤者是張志新(化名)和其女友劉穎荞胡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體了嚎,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泪漂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歪泳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窖梁。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夹囚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邀窃,我是刑警寧澤荸哟,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站瞬捕,受9級(jí)特大地震影響鞍历,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肪虎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一劣砍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扇救,春花似錦刑枝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沧烈,卻和暖如春掠兄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工蚂夕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迅诬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓婿牍,卻偏偏與公主長得像侈贷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子牍汹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

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

  • 基于外鍵的單向一對一關(guān)聯(lián)映射 基于主鍵的單向一對一關(guān)聯(lián)映射 單向多對多關(guān)聯(lián)映射 一铐维、基于外鍵的單向一對一關(guān)聯(lián)映射具...
    Single_YAM閱讀 262評論 0 1
  • 一.單向一對多的關(guān)聯(lián) 通過在 一 方使用 元素標(biāo)識(shí) 多的對象;班級(jí)對象代表一, 學(xué)生對象代表多數(shù)據(jù)結(jié)構(gòu)中班級(jí)表學(xué)生...
    liangxifeng833閱讀 453評論 0 0
  • 集合映射 開發(fā)流程:需求分析/數(shù)據(jù)庫設(shè)計(jì)、項(xiàng)目設(shè)計(jì)/ 編碼/測試/實(shí)施部署上線/驗(yàn)收 需求 : 用戶購買慎菲, 填寫地...
    奮斗的老王閱讀 921評論 0 51
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法嫁蛇,類相關(guān)的語法,內(nèi)部類的語法露该,繼承相關(guān)的語法睬棚,異常的語法,線程的語...
    子非魚_t_閱讀 31,662評論 18 399
  • 她說解幼,她的記憶可以追溯到她一歲半時(shí)抑党。 那天媽媽又把她一個(gè)人鎖在家里去上班。她醒來餓了撵摆,特意站在靠近走廊的窗下大哭底靠,...
    1900零零閱讀 547評論 6 1