hibernate表與表之間的關(guān)系

1夸赫、表與表之間的關(guān)系

  • 一對一 (默認(rèn)主鍵關(guān)聯(lián))
    • 首先在實(shí)體中描述實(shí)體與實(shí)體之間的關(guān)系,然后在映射文件中描述兩個(gè)實(shí)體之間的關(guān)系 <one-to-one>
    • name代表另外一個(gè)在實(shí)體在實(shí)體中的屬性名
    • class :代表另外一個(gè)類的全路徑名
    <class name="com.hemi.bean2.User"  table="user">
    <id name="id"  column="id">
    <generator class="native"></generator>
    </id>
    <property name="name" column="name"></property>
    <property name="age" column="age"></property>
    <one-to-one name="sex" class="com.hemi.bean2.Sex"></one-to-one>
</class>
  • 一對一 (外鍵關(guān)聯(lián))注意:要把看做特殊的多對一
    • 首先在實(shí)體中描述實(shí)體與實(shí)體之間的關(guān)系一張表 在外鍵被約束一方(即添加外鍵的那個(gè))使用<many-to-one name="代表另外一個(gè)在實(shí)體在實(shí)體中的屬性名" unique="true" /> 唯一外鍵約束,才能準(zhǔn)確描述一對一關(guān)系
    • 另一張表 使用<one-to-one name="代表另外一個(gè)在實(shí)體在實(shí)體中的屬性名" property-ref="外鍵名" />代表依賴外鍵來約束關(guān)系
<class name="com.hemi.bean2.Sex"  table="sex">
    <id name="id"  column="id">
    <generator class="native"></generator>
    </id>
    <property name="sex" column="sex"></property>
    <one-to-one name="user" property-ref="sid"></one-to-one>
</class>

有外鍵約束的一方

<class name="com.hemi.bean2.User"  table="user">
    <id name="id"  column="id">
    <generator class="native"></generator>
    </id>
    <property name="name" column="name"></property>
    <property name="age" column="age"></property>
<many-to-one name="sex" column="sid" unique="true"></many-to-one>
</class>

  • 一對多
    首先在實(shí)體中描述實(shí)體與實(shí)體之間的關(guān)系
    然后在映射文件中描述兩個(gè)實(shí)體之間的關(guān)系
    <set name="實(shí)體集合屬性名">
    <key column="外鍵名"/>
    <one-to-many class="多方類的全路徑名"/>
    </set>
<class name="com.hemi.bean.District"  table="district">
    <id name="id"  column="id">
    <generator class="native"></generator>
    </id>
    <property name="name" column="name"></property>
    <set name="streets" cascade="all " inverse="true">
    <key column="District_id"></key>
    <one-to-many class="com.hemi.bean.Street" />
    </set>
</class>
  • 多對一
    首先在實(shí)體中描述實(shí)體與實(shí)體之間的關(guān)系
    然后在映射文件中描述兩個(gè)實(shí)體之間的關(guān)系
    <many-to-one name="一方類在該類中的屬性名" column="外鍵名"/>
<class name="com.hemi.bean.Street"  table="street">
    <id name="id"  column="id">
    <generator class="native"></generator>
    </id>
    <property name="name" column="name"></property> 
    <many-to-one name="district" column="District_id" ></many-to-one>
</class>

2、操作屬性 :

  • 級(jí)聯(lián)操作
    cascade:負(fù)責(zé)維護(hù)表與表之間的增刪改操作 肩豁,屬性值:none(默認(rèn))、save-update研铆、delete、all州叠、merge
private static void save() {
        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        //創(chuàng)建街道對象
        Street street = new Street();
        street.setName("倉前街道1");
        //創(chuàng)建區(qū)對象
        District district = new District();
        district.setName("余杭區(qū)1");
        //創(chuàng)建set集合將街道添加進(jìn)去
        HashSet<Street> set = new HashSet<Street>();
        set.add(street);
        //設(shè)置區(qū)對象的街道集合 
        district.setStreets(set);
        //通過保存區(qū)    同時(shí)會(huì)在街道表中添加數(shù)據(jù)
        session.save(district);
        transaction.commit();
        session.close();
    }
  • 關(guān)系維護(hù)

    inverse:負(fù)責(zé)維護(hù)表與表之間的關(guān)系棵红,默認(rèn)為:false,代表雙方維護(hù)表的關(guān)系留量, true:代表放棄表的維護(hù) (一對多中)只有一方才有權(quán)利放棄 窄赋,多方必須維護(hù),所以沒有該屬性

3楼熄、延遲加載 lazy屬性 默認(rèn)值為true(延遲加載)

類級(jí)別 :在class標(biāo)簽內(nèi)加屬性lazy 默認(rèn)true 對load方法起作用 java代碼取的時(shí)候get(都是立即加載) load(根據(jù)lazy屬性 true延遲加載 false立即加載)
關(guān)聯(lián)級(jí)別:

  • 一對多:
    • 一方在set標(biāo)簽內(nèi)加lazy屬性默認(rèn)true忆绰,extra極其懶惰
    • 多方在many-to-one標(biāo)簽內(nèi)加屬性lazy默認(rèn)false,proxy 懶加載 no-proxy無代理懶加載

4可岂、hql連接查詢

(注意:此處的內(nèi)連接是標(biāo)準(zhǔn)內(nèi)連接: inner join,連表查詢時(shí)不能同時(shí)用兩張表的類 必須通過該類的屬性點(diǎn)出)
內(nèi)連接 :返回的是對象數(shù)組
迫切內(nèi)連接 :返回的是封裝對象
外連接:返回的是對象數(shù)組
迫切外連接:返回的是封裝對象

        Session session = HibernateUtil.getSession();
        //標(biāo)準(zhǔn)內(nèi)連接
        String hql="from District d inner join  d.streets";
        //迫切內(nèi)連接
        String hql1="from District d inner join  fetch d.streets";
        //方言內(nèi)連接-------返回的是對象數(shù)組
        String hql2="select s.name,d.name from Street s,District d where s.district.id=d.id";
        //方言內(nèi)連接-------返回的是對象
        String hql3="select new com.hemi.bean.Address(d.name,s.name) from Street s,District d where s.district.id=d.id";
        Query query = session.createQuery(hql1);
//      List<Address> list = query.list();
//      for (Address address : list) {
//          System.out.println(address);
//      }
        
//      List<Object[]> list = query.list();
//      for (Object[] objects : list) {
//          System.out.println(Arrays.toString(objects));
//      }
        List list = query.list();
        System.out.println(list);
        session.close();

通過注解描述類與表的關(guān)系 簡單介紹

@Entity 注解將一個(gè)類聲明為實(shí)體Bean @Table對應(yīng)的數(shù)據(jù)庫中的表

@Id 主鍵
@GeneratedValue設(shè)置主鍵生成策略 GenerationType.IDENTITY 自動(dòng)增長
@Column(name="id") 設(shè)置數(shù)據(jù)庫表中對應(yīng)的字段如果與實(shí)體類中屬性名相同 則不需要設(shè)置里面的name屬性


@Entity
@Table(name="student")
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column
    private int id;
    @Column
    private String name;
    @Column
    private int age;

@GenericGenerator用來自定義主鍵生成策略

@Entity
@Table(name="animals")
public class Animal {
    @Id
    @GenericGenerator(name="uu",strategy="uuid") @GeneratedValue(generator="uu")
    @Column
    private String id;
    @Column
    private String name;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末错敢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稚茅,老刑警劉巖纸淮,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亚享,居然都是意外死亡咽块,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門欺税,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侈沪,“玉大人,你說我怎么就攤上這事晚凿⊥ぷ铮” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵歼秽,是天一觀的道長应役。 經(jīng)常有香客問我,道長燥筷,這世上最難降的妖魔是什么箩祥? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮荆责,結(jié)果婚禮上滥比,老公的妹妹穿的比我還像新娘亚脆。我一直安慰自己做院,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布濒持。 她就那樣靜靜地躺著键耕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柑营。 梳的紋絲不亂的頭發(fā)上屈雄,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音官套,去河邊找鬼酒奶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奶赔,可吹牛的內(nèi)容都是我干的惋嚎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼站刑,長吁一口氣:“原來是場噩夢啊……” “哼另伍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绞旅,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤摆尝,失蹤者是張志新(化名)和其女友劉穎温艇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堕汞,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勺爱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讯检。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邻寿。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖视哑,靈堂內(nèi)的尸體忽然破棺而出绣否,到底是詐尸還是另有隱情,我是刑警寧澤挡毅,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布蒜撮,位于F島的核電站,受9級(jí)特大地震影響跪呈,放射性物質(zhì)發(fā)生泄漏段磨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一耗绿、第九天 我趴在偏房一處隱蔽的房頂上張望苹支。 院中可真熱鬧,春花似錦误阻、人聲如沸债蜜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寻定。三九已至,卻和暖如春精耐,著一層夾襖步出監(jiān)牢的瞬間狼速,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工卦停, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留向胡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓惊完,卻偏偏與公主長得像僵芹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子专执,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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