国产精品毛片一区二区,欧美熟妇brazzers,丰满女邻居的嫩苞张开视频,天天爽夜夜爽夜夜爽

南京北大青鳥

全國咨詢電話:15195455103

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

Hibernate_繼承映射的方法詳解

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

Hibernate是采用面向?qū)ο蟮乃枷朐O(shè)計的,繼承映射是將對象的繼承關(guān)系映射到數(shù)據(jù)庫對應的表中。

Hibernate是采用面向?qū)ο蟮乃枷朐O(shè)計的,繼承映射是將對象的繼承關(guān)系映射到數(shù)據(jù)庫對應的表中。
繼承映射的方法有三種:1.一個子類對應一張表。
2.整個繼承系統(tǒng)所包含的對象的屬性并集映射到一張表中。
3.父類,子類都各自對應一張表,子類表中只包含私有屬性字段和對應父類的外鍵,父類表中包含所有共有屬性字段。
類的繼承關(guān)系如圖:    
 

北大青鳥軟件學校職業(yè)教育             

對應的類:
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……
}
 
第一種方法:一個子類對應一張表
這里可以為每個子類都寫一個配置文件,配置文件中會自動識別繼承關(guān)系,也可以只寫一個配置文件,在配置文件中自己指定繼承關(guān)系,這里只給出前面方法,后面方法可以參考下文給出的連接。
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的,系統(tǒng)會自動通過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>

同上.
在數(shù)據(jù)庫中生成表格(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("聯(lián)想");
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將數(shù)據(jù)放在緩存中,需要查詢的時候再向數(shù)據(jù)庫發(fā)起查詢.
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語句中如果繼承系統(tǒng)中的類,然而這個類沒有給出配置文件,那么就要寫出這個類的全名,如果這個類是父祖,那么將會查詢出所有子孫對應表格里的數(shù)據(jù)。還需要注意的是Iterator和List使用的區(qū)別,Iterator會在需要得到數(shù)據(jù)的時候再像數(shù)據(jù)庫發(fā)起一條查詢語句,而List會通過一條查詢語句將所有數(shù)據(jù)裝載在內(nèi)存中。
 
第二種方法:整個繼承系統(tǒng)所包含的對象的屬性并集映射到一張表中
這種方法只需要寫一個配置文件對應于根父類:
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         <!-- 鑒別器,在數(shù)據(jù)中區(qū)別子類的字段定義 -->
 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行是為鑒別器中子類進行區(qū)分的值.注意第8行的鑒別器一定要放在<id/>下面,否則運行時出錯,剛開始的時候我是寫在子類配置的上面的,結(jié)果運行時報錯。
建表語句:
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("聯(lián)想");
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("學生分數(shù)是:" + ((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是在緩存中的,當需要查詢的時候才向數(shù)據(jù)庫發(fā)出查詢請求,如果這里用Interator只能查到id字段,下面的不再進行查詢。如果需要查詢指定的子類,例如Student,那么在HQL語句中,對子類全名進行查詢:session.createQuery("from com.sunflower.yuan.pojo.Student")。
 
第三種方法:父類,子類都各自對應一張表
這種方法父類、子類都各自對應一張表,父類和子類表中通過主鍵外鍵關(guān)聯(lián)
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/>標簽是加入子類關(guān)聯(lián)的標簽,第12行和第18行中是指定與父類表關(guān)聯(lián)的外鍵 
建表語句:
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);


分享到:

相關(guān)閱讀:

近期文章

搶試聽名額

名額僅剩66名

教育改變生活

WE CHANGE LIVES