• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            hibernate多表關(guān)聯(lián)總結(jié)

            1>:one-to-one(一對(duì)一關(guān)聯(lián))主鍵關(guān)聯(lián):

            一對(duì)一關(guān)聯(lián)一般可分為主鍵關(guān)聯(lián)和外鍵關(guān)聯(lián)

            主鍵關(guān)聯(lián)的意思是說(shuō)關(guān)聯(lián)的兩個(gè)實(shí)體共享一個(gè)主鍵值,但這個(gè)主鍵可以由兩個(gè)表產(chǎn)生.

            現(xiàn)在的問(wèn)題是:

            *如何讓另一個(gè)表引用已經(jīng)生成的主鍵值

            解決辦法:

            *Hibernate映射文件中使用主鍵的foreign生成機(jī)制

            eg:學(xué)生表:

            <hibernate-mapping>

             <class table="user" catalog="study">

             <id type="java.lang.Integer">

             <column />

             <generator />

             </id>

             <property type="java.lang.String">

             <column length="20" />

            </property>

            <one-to-one cascade="all"></one-to-one>

            </class>

            </hibernate-mapping>

            添加:<one-to-one

             

            fetch="join"

            cascade="all" />

            <class>元素的lazy屬性為true,表示延遲加載,如果lazy設(shè)為false,則表示立即加載.以下對(duì)這二點(diǎn)進(jìn)行說(shuō)明.

            立即加載:表示在從數(shù)據(jù)庫(kù)中取得數(shù)據(jù)組裝好一個(gè)對(duì)象后,會(huì)立即再?gòu)臄?shù)據(jù)庫(kù)取得數(shù)據(jù)組裝此對(duì)象所關(guān)聯(lián)的對(duì)象

            延遲加載:表示在從數(shù)據(jù)庫(kù)中取得數(shù)據(jù)組裝好一個(gè)對(duì)象后,不會(huì)立即從數(shù)據(jù)庫(kù)中取得數(shù)據(jù)組裝此對(duì)象所關(guān)聯(lián)的對(duì)象,

            而是等到需要時(shí),才會(huì)從數(shù)據(jù)庫(kù)取得數(shù)據(jù)組裝此關(guān)聯(lián)對(duì)象.

            <one-to-one>元素的fetch屬性可選為selectjoin

            join:連接抓取,Hibernate通過(guò)在Select語(yǔ)句中使用outer join(外連接)來(lái)獲得對(duì)象的關(guān)聯(lián)實(shí)例或者關(guān)聯(lián)集合.

            select:查詢抓取,Hibernate需要另外發(fā)送一條select語(yǔ)句抓取當(dāng)前對(duì)象的關(guān)聯(lián)實(shí)體或集合.

            ******所以我們一般用連接抓取<join>

            證件表:

            <hibernate-mapping>

            <class table="card" lazy="true" catalog="study">

            <id type="java.lang.Integer">

            <column />

            <generator >

            <param >user</param>

            </generator>

            </id>

            <!-- id使用外鍵(foreign)生成機(jī)制,引用代號(hào)為user的對(duì)象

            的主鍵作為card表的主鍵和外鍵。同時(shí)user在下面的

            <one-to-one>中進(jìn)行了定義 -->

            <property type="java.lang.Integer">

            <column />

            </property>

            <one-to-one constrained="true"></one-to-one>

            <!-- constrained="true"表示card引用了student的主鍵作為外鍵。 -->

            </class>

            </hibernate-mapping>

            一對(duì)一映射必須加載的元素有:

            name

            class

            constrained(主鍵關(guān)聯(lián))

            fetch(關(guān)聯(lián)的一方才有:意思是說(shuō)需要通過(guò)這一方查詢另一方數(shù)據(jù)的一方.比如學(xué)生表查詢證件中的數(shù)據(jù),學(xué)生就是關(guān)聯(lián)的一方)

            cascade(關(guān)聯(lián)的一方才有:意思是說(shuō)需要通過(guò)這一方保存或者更新數(shù)據(jù)對(duì)另一方也產(chǎn)生影響(另一方也保存或者更新了,比如保存學(xué)生信息,那么與學(xué)生相關(guān)聯(lián)的證件信息也保存了))

             

            2><one-to-one>外鍵關(guān)聯(lián):

            開(kāi)發(fā)中可以參照<one-to-one>主鍵關(guān)聯(lián)和<many-to-one>

            這里,學(xué)生表保存不變,只改變證件表:

            <hibernate-mapping>

            <class table="card" lazy="true">

            <id type="java.lang.Integer">

            <column />

            <generator /><!-- 不再是foreign,因?yàn)樗闹麈I不是學(xué)生表的主鍵,它的主鍵是自動(dòng)產(chǎn)生的,它的外鍵才是學(xué)生表的主鍵 -->

            </id>

            <property type="java.lang.String">

            <column length="20" />

            </property>

            <many-to-one column="userid" unique="true"/>

            <!-- 惟一的多對(duì)一,如果被限制為唯一,實(shí)際上變成一對(duì)一關(guān)系了 -->

            <!-- unique設(shè)為true表示使用DDL為外鍵字段生成一個(gè)惟一約束。

            以外鍵關(guān)聯(lián)對(duì)象的一對(duì)一關(guān)系,其本質(zhì)上已經(jīng)變成了一對(duì)多的雙向關(guān)聯(lián),

            應(yīng)直接按照一對(duì)多和多對(duì)一的要求編寫(xiě)它們的映射文件。當(dāng)unique

            true時(shí)實(shí)際上變成了一對(duì)一的關(guān)系。

            ***這里需要強(qiáng)調(diào)一點(diǎn)的是<many-to-one>元素必須有column這一項(xiàng),它表示這個(gè)這個(gè)表的外鍵是什么.注意,這里是表的外鍵,不是類(lèi)的外鍵-->

            </class>

            </hibernate-mapping>

             

            3>:<one-to-many>單身關(guān)聯(lián)

            一對(duì)多關(guān)聯(lián)分為單向一對(duì)多關(guān)聯(lián)和雙向一雙多關(guān)聯(lián)

            單向的一對(duì)多關(guān)聯(lián)只需要在一方進(jìn)行映射配置

            單身一對(duì)多關(guān)聯(lián):

            <hibernate-mapping>

            <class table="customers" catalog="study">

            <id type="java.lang.Long">

            <column />

            <generator />

            </id>

            <property type="java.lang.String">

            <column length="20" />

            </property>

            <set table="orders" cascade="save-update" inverse="true">

            <key column="customers_ID"></key>

            <one-to-many />

            </set>

            </class>

            </hibernate-mapping>

            這里需要強(qiáng)調(diào)的是<set>元素的屬性代表的意義:

            name

            table

            lazy:當(dāng)為true時(shí)為延遲加載,false時(shí)為立即加載

            inverse:用于表示雙向關(guān)聯(lián)中的被動(dòng)一端,inverse的值為false的一方負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系

            cascade

            sort:排序關(guān)系,unsorted(不排序),natural(自然排序),comparatorClass(由某個(gè)實(shí)現(xiàn)了java.util.comparator接口的類(lèi)型  指定排序算法。);

            ******<key>子元素的column屬性指定關(guān)聯(lián)表(orders)的外鍵(customers_ID)

            4>:<one-to-many>雙向關(guān)聯(lián):

            如果要設(shè)置一對(duì)多雙向關(guān)聯(lián)關(guān)系.那么還需要在""的映射文件中使用<many-to-one>

            <many-to-one

             

            column="customers_ID"

            cascade="none"

            outer-join="auto"

            insert="false" insertupdate設(shè)定是否對(duì)column屬性指定的關(guān)聯(lián)字段進(jìn)行insertupdate操作

            update="false">

            </many-to-one>

             

             

            4>多對(duì)多關(guān)聯(lián):

            多對(duì)多關(guān)聯(lián)時(shí)要建一個(gè)連接表查詢

            學(xué)生的映射文件

            <hibernate-mapping>

            <class table="students" catalog="study">

            <id type="java.lang.Long">

            <column />

            <generator />

            </id>

            <property type="java.lang.String">

            <column length="20" />

            </property>

            <set table="student_teacher_table" cascade="save-update" inverse="false">

            <key column="stuID"></key>

            <many-to-many column="teaID"></many-to-many>

            </set>

            ***對(duì)<key>元素的理解:

            它的控制主要是通過(guò)stuID(外鍵)來(lái)完成,就是我們從student_teacher_table表中我們只要

            select * from student_teacher_table where stuID='該學(xué)生的ID',這樣我們就可以得到它的教師的ID

            ***對(duì)<many-to-many>的理解:

            我們從student_teacher_table表中根據(jù)stuID拿到了與該stuID關(guān)聯(lián)的teaID,

            然后select * from teacher where teaID='前一步拿到的teaID'

            </class>

            </hibernate-mapping>

             

            教師的映射文件

            <hibernate-mapping>

            <class table="teachers" catalog="study">

            <id type="java.lang.Long">

            <column />

            <generator />

            </id>

            <property type="java.lang.String">

            <column length="20" />

            </property>

            <set table="student_teacher_table" inverse="true">

            <key column="teaID"></key>

            <many-to-many column="stuID"></many-to-many>

            </set>

            </class>

            </hibernate-mapping>

             

            posted on 2009-08-05 13:24 肥仔 閱讀(1279) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Web-后臺(tái)

            久久精品国产亚洲AV不卡| 色婷婷综合久久久中文字幕| 青青青青久久精品国产| 久久亚洲国产成人影院| 国产精品成人久久久| 久久大香香蕉国产| 久久久精品日本一区二区三区 | 久久99免费视频| 亚洲va久久久久| 欧美激情精品久久久久| 久久精品国产精品亚洲精品| 久久99精品国产一区二区三区| 亚洲成av人片不卡无码久久| 99久久国产热无码精品免费| 亚洲精品视频久久久| 精品乱码久久久久久久| 麻豆av久久av盛宴av| 国产精品美女久久久免费| 亚洲AV无码久久精品狠狠爱浪潮 | 狠狠色丁香婷婷综合久久来来去| 久久天天躁狠狠躁夜夜躁2014| 91麻精品国产91久久久久| 久久99国产精品一区二区| 亚洲中文字幕无码一久久区| 香蕉99久久国产综合精品宅男自| 国产产无码乱码精品久久鸭| 国产精品99久久久精品无码| 久久亚洲国产成人精品无码区| 国产AⅤ精品一区二区三区久久| 国内精品久久久久久99| 天天躁日日躁狠狠久久| 99久久无色码中文字幕人妻| 久久经典免费视频| 久久青青草视频| 99精品国产免费久久久久久下载| 香蕉aa三级久久毛片| 色天使久久综合网天天| 中文成人无码精品久久久不卡| 欧美成人免费观看久久| 久久精品亚洲AV久久久无码| 久久久久亚洲AV无码专区首JN|