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综合网成人| 亚洲色图综合在线| 色婷婷六月亚洲综合香蕉| 一本一道色欲综合网中文字幕| 色婷婷综合久久久久中文一区二区| 狠狠色综合久久婷婷色天使| 97色婷婷成人综合在线观看| 国产综合久久久久| 丁香狠狠色婷婷久久综合| 久久综合久久美利坚合众国| 狠狠色综合色综合网络| 国产激情综合在线观看| 色噜噜久久综合伊人一本| 国产综合色香蕉精品五月婷| 国产精品亚洲综合五月天| 丁香婷婷色五月激情综合深爱| 色婷婷久久综合中文网站| 久久精品桃花综合| 亚洲日本国产综合高清| 亚洲综合色丁香麻豆| 天天爽天天狠久久久综合麻豆| 国产综合内射日韩久| 亚洲狠狠婷婷综合久久久久| 狠狠色综合色综合网络| 久久久久青草大香线综合精品| 99精品国产综合久久久久五月天| 国产激情电影综合在线看 | 97se亚洲综合在线| 色婷婷综合久久久中文字幕| 亚洲av日韩av综合| 亚洲综合av一区二区三区| 思思91精品国产综合在线| 一本久道久久综合| 久久精品国产91久久综合麻豆自制|