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

    南京中博教育

    全國咨詢電話:17368476151

    三分鐘了解中博教育
    當前位置:南京中博教育 > 學習園地 > 編程技巧

    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_久久久| 韩国亚洲伊人久久综合影院| 鲁一鲁一鲁一鲁一曰综合网| 综合三区后入内射国产馆| 色噜噜狠狠狠狠色综合久| 色噜噜成人综合网站| 久久婷婷五月综合尤物色国产| 国产综合成色在线视频| 亚洲av综合日韩| 国产成人亚洲综合一区| 狠狠色丁香久久婷婷综合蜜芽五月 | 天天av天天翘天天综合网| 久久综合国产乱子伦精品免费| 一本综合久久国产二区| 国产成人精品综合| 麻豆精品一区二区综合av| 久久99国产综合精品| 在线综合亚洲中文精品| 色狠狠久久综合网| 狠狠色狠狠色很很综合很久久| 色噜噜狠狠色综合欧洲| 丁香婷婷色五月激情综合深爱| 一本一本久久A久久综合精品| 久久亚洲伊人中字综合精品| 97久久国产综合精品女不卡 | 亚洲国产成人久久综合| 日韩亚洲综合精品国产| 国产综合在线观看| 色噜噜狠狠成人中文综合| 热久久综合这里只有精品电影 | 色噜噜狠狠色综合欧洲selulu| 亚洲色欲久久久久综合网|