1. <bdo id="8zfej"></bdo>
    <li id="8zfej"><meter id="8zfej"><th id="8zfej"></th></meter></li>

    南京北大青鳥

    全國咨詢電話:15195455103

    三分鐘了解北大青鳥
    當前位置:南京北大青鳥 > 學習園地 > 編程技巧

    Hibernate_繼承映射的方法詳解

    來源:南京北大青鳥張府園? ? ? 作者:IT教育 ? ??

    Hibernate是采用面向對象的思想設計的,繼承映射是將對象的繼承關系映射到數據庫對應的表中。

    Hibernate是采用面向對象的思想設計的,繼承映射是將對象的繼承關系映射到數據庫對應的表中。
    繼承映射的方法有三種:1.一個子類對應一張表。
    2.整個繼承系統所包含的對象的屬性并集映射到一張表中。
    3.父類,子類都各自對應一張表,子類表中只包含私有屬性字段和對應父類的外鍵,父類表中包含所有共有屬性字段。
    類的繼承關系如圖:    
     

    北大青鳥軟件學校職業教育             

    對應的類:
    Peopel.java:

    public class People {
        private String id;
        private String name;
        private int age;

        //getter,setter
    }

    Student.java:
    public class Student extends People {
        private int point;
       
        //getter,setter……
    }
    Engineer.java:
    public class Engineer extends People {
        private String computer;

        //getter,setter……
    }
     
    第一種方法:一個子類對應一張表
    這里可以為每個子類都寫一個配置文件,配置文件中會自動識別繼承關系,也可以只寫一個配置文件,在配置文件中自己指定繼承關系,這里只給出前面方法,后面方法可以參考下文給出的連接。
    Student.hbm.xml:

     1 <hibernate-mapping>
     2     <class name="com.sunflower.yuan.pojo.Student" table="student">
     3         <id name="id" type="string" column="id">
     4             <generator class="uuid"></generator>
     5         </id>
     6
     7         <property name="name" type="string" column="name"></property>
     8         <property name="age" type="integer" column="age"></property>
     9         <property name="point" type="integer" column="point"></property>
    10     </class>
    11 </hibernate-mapping>

    第3至第8行中的name="id",name="name",name="age"屬性都是繼承自People的,系統會自動通過getter方法得到
    Engineer.hbm.xml:

     1 <hibernate-mapping>
     2     <class name="com.sunflower.yuan.pojo.Engineer" table="engineer">
     3         <id name="id" type="string" column="id">
     4             <generator class="uuid"></generator>
     5         </id>
     6
     7         <property name="name" type="string" column="name"></property>
     8         <property name="age" type="integer" column="age"></property>
     9         <property name="computer" type="string" column="computer"></property>
    10     </class>
    11 </hibernate-mapping>

    同上.
    在數據庫中生成表格(SQL語句):
    drop table if exists engineerdrop table if exists studentcreate table engineer (id varchar(255) not null, name varchar(255), age integer, computer varchar(255), primary key (id))create table student (id varchar(255) not null, name varchar(255), age integer, point integer, primary key (id))
    測試:

     1 public class Test {
     2     // 保存測試
     3     public void save() {
     4         Session session = HibernateUtil.getSession();
     5         Transaction ts = session.beginTransaction();
     6
     7         try {
     8             Student student = new Student();
     9             student.setName("宮崎駿");
    10             student.setAge(18);
    11             student.setPoint(90);
    12
    13             Engineer engineer = new Engineer();
    14             engineer.setName("錢學森");
    15             engineer.setAge(50);
    16             engineer.setComputer("聯想");
    17
    18             session.save(student);
    19             session.save(engineer);
    20
    21             ts.commit();
    22         }
    23         catch (Exception e) {
    24             ts.rollback();
    25             e.printStackTrace();
    26         }
    27         finally {
    28             HibernateUtil.closeSession(session);
    29         }
    30     }
    31
    32     // 查詢測試
    33     @SuppressWarnings("unchecked")
    34     public void get() {
    35         Session session = HibernateUtil.getSession();
    36         Transaction ts = session.beginTransaction();
    37
    38         try {
    39             //Iterator將數據放在緩存中,需要查詢的時候再向數據庫發起查詢.
    40             Iterator iter = session.createQuery(
    41                     "from com.sunflower.yuan.pojo.People").iterate();
    42             while (iter.hasNext()) {
    43                 People people = (People)iter.next();
    44                 System.out.println(people.getName());
    45             }
    46             ts.commit();
    47         }
    48         catch (Exception e) {
    49             ts.rollback();
    50             e.printStackTrace();
    51         }
    52         finally {
    53             HibernateUtil.closeSession(session);
    54         }
    55     }
    56
    57     public static void main(String[] args) {
    58         Test test = new Test();
    59 //        test.save();
    60         test.get();
    61     }
    62 }

    第40至第41行需要注意:HQL語句中如果繼承系統中的類,然而這個類沒有給出配置文件,那么就要寫出這個類的全名,如果這個類是父祖,那么將會查詢出所有子孫對應表格里的數據。還需要注意的是Iterator和List使用的區別,Iterator會在需要得到數據的時候再像數據庫發起一條查詢語句,而List會通過一條查詢語句將所有數據裝載在內存中。
     
    第二種方法:整個繼承系統所包含的對象的屬性并集映射到一張表中
    這種方法只需要寫一個配置文件對應于根父類:
    People.hbm.xml:

     1 <hibernate-mapping>
     2     <class name="com.sunflower.yuan.pojo.People" table="people">
     3         <id name="id" type="string" column="id">
     4             <generator class="uuid"></generator>
     5         </id>
     6
     7         <!-- 鑒別器,在數據中區別子類的字段定義 -->
     8         <discriminator column="peopleType" type="string"></discriminator>
     9        
    10         <property name="name" type="string" column="name"></property>
    11         <property name="age" type="integer" column="age"></property>
    12
    13         <subclass name="com.sunflower.yuan.pojo.Student"
    14             discriminator-value="student">
    15             <property name="point" type="integer" column="point"></property>
    16         </subclass>
    17
    18         <subclass name="com.sunflower.yuan.pojo.Engineer"
    19             discriminator-value="engineer">
    20             <property name="computer" type="string" column="computer"></property>
    21         </subclass>
    22     </class>
    23 </hibernate-mapping>

    第8行為鑒別器,用于在表中鑒別出不同的子類,第14行和第19行是為鑒別器中子類進行區分的值.注意第8行的鑒別器一定要放在<id/>下面,否則運行時出錯,剛開始的時候我是寫在子類配置的上面的,結果運行時報錯。
    建表語句:
    drop table if exists peoplecreate table people (id varchar(255) not null, peopleType varchar(255) not null, name varchar(255), age integer, point integer, computer varchar(255), primary key (id))
    測試:
    Test.java:

     1 public class Test {
     2     // 保存測試
     3     public void save() {
     4         Session session = HibernateUtil.getSession();
     5         Transaction ts = session.beginTransaction();
     6
     7         try {
     8             Student student = new Student();
     9             student.setName("宮崎駿");
    10             student.setAge(18);
    11             student.setPoint(90);
    12
    13             Engineer engineer = new Engineer();
    14             engineer.setName("錢學森");
    15             engineer.setAge(50);
    16             engineer.setComputer("聯想");
    17
    18             session.save(student);
    19             session.save(engineer);
    20
    21             ts.commit();
    22         }
    23         catch (Exception e) {
    24             ts.rollback();
    25             e.printStackTrace();
    26         }
    27         finally {
    28             HibernateUtil.closeSession(session);
    29         }
    30     }
    31
    32     // 查詢測試
    33     @SuppressWarnings("unchecked")
    34     public void get() {
    35         Session session = HibernateUtil.getSession();
    36         Transaction ts = session.beginTransaction();
    37
    38         try {
    39             List list = session.createQuery("from People").list();
    40             for (int i = 0; i < list.size(); i++) {
    41                 Object obj = list.get(i);
    42                 if (obj instanceof Student) {
    43                     System.out.println("學生分數是:" + ((Student) obj).getPoint());
    44                 }
    45                 if (obj instanceof Engineer)
    46                     System.out.println("工程師電腦是:"
    47                             + ((Engineer) obj).getComputer());
    48             }
    49             ts.commit();
    50         }
    51         catch (Exception e) {
    52             ts.rollback();
    53             e.printStackTrace();
    54         }
    55         finally {
    56             HibernateUtil.closeSession(session);
    57         }
    58     }
    59
    60     public static void main(String[] args) {
    61         Test test = new Test();
    62         // test.save();
    63         test.get();
    64     }
    65 }

    第39至48行是遍歷整個表,進行判斷查找出不同子類的信息。注意這里的遍歷用的是List而不是Interator,因為Interator是在緩存中的,當需要查詢的時候才向數據庫發出查詢請求,如果這里用Interator只能查到id字段,下面的不再進行查詢。如果需要查詢指定的子類,例如Student,那么在HQL語句中,對子類全名進行查詢:session.createQuery("from com.sunflower.yuan.pojo.Student")。
     
    第三種方法:父類,子類都各自對應一張表
    這種方法父類、子類都各自對應一張表,父類和子類表中通過主鍵外鍵關聯
    People.hbm.xml:

     1 <hibernate-mapping>
     2     <class name="com.sunflower.yuan.pojo.People" table="people">
     3         <id name="id" type="string" column="id">
     4             <generator class="uuid"></generator>
     5         </id>
     6
     7         <property name="name" type="string" column="name"></property>
     8         <property name="age" type="integer" column="age"></property>
     9
    10         <joined-subclass name="com.sunflower.yuan.pojo.Student"
    11             table="student">
    12             <key column="id"></key>
    13             <property name="point" type="integer" column="point"></property>
    14         </joined-subclass>
    15
    16         <joined-subclass name="com.sunflower.yuan.pojo.Engineer"
    17             table="engineer">
    18             <key column="id"></key>
    19             <property name="computer" type="string" column="computer"></property>
    20         </joined-subclass>
    21     </class>
    22 </hibernate-mapping>

    第10行和第16行中<joined-subclass/>標簽是加入子類關聯的標簽,第12行和第18行中是指定與父類表關聯的外鍵 
    建表語句:
    alter table engineer drop foreign key FK6C827E6FD8CA6343;alter table student drop foreign key FK8FFE823BD8CA6343;drop table if exists engineer;drop table if exists people;drop table if exists student;create table engineer (id varchar(255) not null, computer varchar(255), primary key (id));create table people (id varchar(255) not null, name varchar(255), age integer, primary key (id));create table student (id varchar(255) not null, point integer, primary key (id));alter table engineer add index FK6C827E6FD8CA6343 (id), add constraint FK6C827E6FD8CA6343 foreign key (id) references people (id);


    分享到:

    相關閱讀:

    近期文章

    搶試聽名額

    名額僅剩66名

    教育改變生活

    WE CHANGE LIVES

    主站蜘蛛池模板: 色噜噜综合亚洲av中文无码| 色综合天天综合网| 伊人久久大香线蕉综合电影网| 亚洲国产精品综合久久一线| 亚州欧州一本综合天堂网| 亚洲av日韩综合一区久热| 国产精品亚洲综合专区片高清久久久 | 成人综合激情另类小说| 国产激情电影综合在线看 | 国产精品亚洲综合| 色综合AV综合无码综合网站| 国产性天天综合网| 自拍 偷拍 另类 综合图片| 狠狠色丁香婷婷综合激情| 国产成人综合亚洲一区| 色综合合久久天天综合绕视看| 一本色道久久88综合亚洲精品高清| 国产91色综合久久免费分享| 日本伊人色综合网| 国产精品激情综合久久| 天啪天天久久天天综合啪| 久久综合九色综合久99| 国产婷婷综合丁香亚洲欧洲| 亚洲婷婷综合色高清在线| 久久亚洲综合色一区二区三区| 狠狠久久综合伊人不卡| 色综合久久98天天综合| 伊人久久久大香线蕉综合直播| 97色伦图片97综合影院久久| 狠狠色丁香婷综合久久| 国产精品天干天干综合网| 91精品国产综合久久青草| 97色伦图片97综合影院久久| 色综合合久久天天综合绕视看| 国产成人综合在线观看网站| 色综合小说久久综合图片| 国产精品无码久久综合网| 区二区三区激情综合 | 久久精品国产91久久综合麻豆自制| 亚洲 综合 国产 欧洲 丝袜 | 插插插色欲综合网|