Hibernate學(xué)習(xí)13(映射繼承關(guān)系)

映射繼承關(guān)系有三種方法
  • 使用subclass元素子類數(shù)據(jù)和父類數(shù)據(jù)都存在一張表中 通過鑒別者列值進(jìn)行區(qū)分
    1.查詢父類記錄缓窜,只需要查詢一張數(shù)據(jù)表
    2.對于子記錄橡伞,也只需查詢一張表
    缺點(diǎn):
    1.使用辨別者列
    2.子類獨(dú)有字段無法添加非空判斷
    3.若繼承較深炼幔,數(shù)據(jù)表字段也會較多
  • oined-subclass元素 子類會生成一張新表 保存父類沒有的列參照父類OID生成子類OID
    1.查詢父類記錄,做一個左外鏈接查詢
    2.對于子類查詢践宴,做一個內(nèi)鏈接查詢
    優(yōu)點(diǎn):
    1.不需要使用辨別者列
    2.子類獨(dú)有字段可以加非空約束
    3.沒有冗余字段
  • union-subclass元素 子類表和父類包都是完整的表
    1.查詢父類記錄哨查,需要把父表和子表做匯總查詢
    2.對于子類查詢,只需要查一張表
    缺點(diǎn):
    1.存在冗余字段
    2.父類更新麻煩效率低
父類
public class Person {
    
    private Integer id;
    private String name;
    private int age;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
子類

public class Student extends Person {
    private String school;

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }

}

subclass元素

映射文件
  • 只需要設(shè)置父類

  • 配置鑒別者列 <discriminator column="TYPE" type="string"></discriminator>

  • discriminator-value指定辨別者類的值

  • 映射子類 subclass映射

<hibernate-mapping>
    <class name="chen.Person" table="PERSON" discriminator-value="PERSON">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <!-- 配置鑒別者列 -->
        <!-- discriminator-value指定辨別者類的值 -->
        <discriminator column="TYPE" type="string"></discriminator>

        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>

        <!-- 映射子類 subclass映射 -->
        <subclass name="chen.Student" discriminator-value="STUDENT">
            <property name="school" type="string" column="SCHOOL"></property>
        </subclass>
    </class>
</hibernate-mapping>
數(shù)據(jù)表
subclass元素 保存
/**
     * 映射繼承關(guān)系 subclass元素在一張表中
     */
    public static void testExtendsSubclass() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        Person person=new Person();
        person.setAge(20);
        person.setName("張三");
        
        
        Student student=new Student();
        student.setAge(24);
        student.setName("王五");
        student.setSchool("呵呵呵");
        
        session.save(person);
        session.save(student);
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
subclass元素 查詢
/**
     * 映射繼承關(guān)系 subclass元素 查詢
     * 1.查詢父類記錄弦疮,只需要查詢一張數(shù)據(jù)表
     * 2.對于子記錄夹攒,也只需查詢一張表
     * 缺點(diǎn):
     * 1.使用辨別者列
     * 2.子類獨(dú)有字段無法添加非空判斷
     * 3.若繼承較深,數(shù)據(jù)表字段也會較多
     * */
    public static void testExtendsSubclassQuery() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        //createQuery參數(shù)是類名
        List<Person> persons = session.createQuery("FROM Person").list();
        System.out.println(persons.size());
        
        List<Student> students = session.createQuery("FROM Student").list();
        System.out.println(students.size());
        
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
    
    

joined-subclass元素

配置映射文件
<hibernate-mapping>
    <class name="cheniso.Person" table="PERSONISO">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>
        <joined-subclass name="cheniso.Student" table="STUDENT">
            <!-- 參照父表主鍵生成子表主鍵 -->
            <key column="STUDENT_ID"></key>
            <property name="school" column="school"></property>
        </joined-subclass>

    </class>
</hibernate-mapping>
父類表
子類獨(dú)有字段表
保存
/**
     * 映射繼承關(guān)系 joined-subclass元素 
     * 1.子類會生成一張新表 保存父類沒有的列
     * 2.對于子類至少要插入兩張表
     */
    public static void testExtendsJoinedSubclass() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        cheniso.Person person=new cheniso.Person();
        person.setAge(20);
        person.setName("張三");
        
        
        cheniso.Student student=new cheniso.Student();
        student.setAge(24);
        student.setName("王五");
        student.setSchool("呵呵呵");
        
        session.save(person);
        session.save(student);
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
    
查詢
/**
     * 映射繼承關(guān)系 joined-subclass元素 查詢
     * 1.查詢父類記錄胁塞,做一個左外鏈接查詢
     * 2.對于子類查詢咏尝,做一個內(nèi)鏈接查詢
     * 優(yōu)點(diǎn):
     * 1.不需要使用辨別者列
     * 2.子類獨(dú)有字段可以加非空約束
     * 3.沒有冗余字段
     * */
    public static void testExtendsJoinedSubclassQuery() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        List<cheniso.Person> persons = session.createQuery("FROM cheniso.Person").list();
        System.out.println(persons.size());
        
        List<cheniso.Student> students = session.createQuery("FROM cheniso.Student").list();
        System.out.println(students.size());
        
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }

union-subclass元素

配置映射文件
  • 主主鍵生成方式increment
<hibernate-mapping>
    <class name="chenisoa.Person" table="PERSONISOA">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="age" type="int">
            <column name="AGE" />
        </property>
        <union-subclass name="chenisoa.Student" table="studentisoa">
            <property name="school" column="SCHOOL" type="string"></property>
        </union-subclass>

    </class>
</hibernate-mapping>
父類表
子類表
保存
    /**
     * 映射繼承關(guān)系 union-subclass元素 
     * 1.子類表和父類包都是完整的表
     * 2.子類插入只需一張表
     * 3.子類獨(dú)有字段可以加非空約束
     */
    public static void testExtendsUnionSubclass() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        chenisoa.Person person=new chenisoa.Person();
        person.setAge(20);
        person.setName("張三");
        
        
        chenisoa.Student student=new chenisoa.Student();
        student.setAge(24);
        student.setName("王五");
        student.setSchool("呵呵呵");
        
        session.save(person);
        session.save(student);
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
查詢
/**
     * 映射繼承關(guān)系 union-subclass元素  查詢
     * 
     * 1.查詢父類記錄,需要把父表和子表做匯總查詢
     * 2.對于子類查詢啸罢,只需要查一張表
     * 缺點(diǎn):
     * 1.存在冗余字段
     * 2.父類更新麻煩效率低
     * */
    public static void testExtendsUnionSubclassQuery() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        List<chenisoa.Person> persons = session.createQuery("FROM chenisoa.Person").list();
        System.out.println(persons.size());
        
        List<chenisoa.Student> students = session.createQuery("FROM chenisoa.Student").list();
        System.out.println(students.size());
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末编检,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扰才,更是在濱河造成了極大的恐慌允懂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衩匣,死亡現(xiàn)場離奇詭異蕾总,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)琅捏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門生百,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柄延,你說我怎么就攤上這事蚀浆。” “怎么了拦焚?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵蜡坊,是天一觀的道長。 經(jīng)常有香客問我赎败,道長秕衙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任僵刮,我火速辦了婚禮据忘,結(jié)果婚禮上鹦牛,老公的妹妹穿的比我還像新娘。我一直安慰自己勇吊,他們只是感情好曼追,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汉规,像睡著了一般礼殊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上针史,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天晶伦,我揣著相機(jī)與錄音,去河邊找鬼啄枕。 笑死婚陪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的频祝。 我是一名探鬼主播泌参,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼常空!你這毒婦竟也來了沽一?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤窟绷,失蹤者是張志新(化名)和其女友劉穎锯玛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兼蜈,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年拙友,在試婚紗的時候發(fā)現(xiàn)自己被綠了为狸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡遗契,死狀恐怖辐棒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牍蜂,我是刑警寧澤漾根,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站鲫竞,受9級特大地震影響辐怕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜从绘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一寄疏、第九天 我趴在偏房一處隱蔽的房頂上張望是牢。 院中可真熱鬧,春花似錦陕截、人聲如沸驳棱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽社搅。三九已至,卻和暖如春乳规,著一層夾襖步出監(jiān)牢的瞬間形葬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工驯妄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荷并,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓青扔,卻偏偏與公主長得像源织,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子微猖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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

  • 對象的狀態(tài) Hibernate中對象的狀態(tài) : 臨時/瞬時狀態(tài)谈息、持久化狀態(tài)、游離狀態(tài)臨時狀態(tài)特點(diǎn):直接new出來的...
    奮斗的老王閱讀 918評論 0 49
  • Hibernate: 一個持久化框架 一個ORM框架 加載:根據(jù)特定的OID,把一個對象從數(shù)據(jù)庫加載到內(nèi)存中OID...
    JHMichael閱讀 1,963評論 0 27
  • 一凛剥、繼承映射的三種策略: 單表繼承侠仇。一棵類繼承樹使用一個表(table per class hierachy) 具...
    yjaal閱讀 292評論 2 1
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL犁珠、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,453評論 0 4
  • 走過萬水千山逻炊, 經(jīng)歷春夏秋冬, 遙望日月星辰犁享, 辨認(rèn)南北西東余素。 這世間,人不過 只是紅塵匆匆過客炊昆, 只有宇宙乾坤 ...
    夕陽在山閱讀 307評論 4 3