Android中如何搭建一個WebServer

來源:互聯網
上載者:User

標籤:des   android   c   style   class   blog   

  • 對於物件導向的程式設計語言而言,繼承和多態是兩個最基本的概念。Hibernate 的繼承映射可以理解持久化類之間的繼承關係。例如:人和學生之間的關係。學生繼承了人,可以認為學生是一個特殊的人,如果對人進行查詢,學生的執行個體也將被得到。

  • Hibernate支援三種繼承映射策略:
使用 subclass 進行映射:將領域模型中的每一個實體物件映射到一個獨立的表中,也就是說不用在關係資料模型中考慮領域模型中的繼承關係和多態。
使用 joined-subclass 進行映射: 對於繼承關係中的子類使用同一個表,這就需要在資料庫表中增加額外的區分子類類型的欄位。
使用 union-subclass 進行映射:領域模型中的每個類映射到一個表,通過關係資料模型中的外鍵來描述表之間的繼承關係。這也就相當於按照領域模型的結構來建立資料庫中的表,並通過外鍵來建立表之間的繼承關係。


採用 subclass 元素的繼承映射
  • 採用 subclass 的繼承映射可以實現對於繼承關係中父類和子類使用同一張表
  • 因為父類和子類的執行個體全部儲存在同一個表中,因此需要在該表內增加一列,使用該列來區分每行記錄到低是哪個類的執行個體----這個列被稱為辨別者列(discriminator).
  • 在這種映射策略下,使用 subclass 來映射子類,使用 class 或 subclass 的 discriminator-value 屬性指定辨別者列的值
  • 所有子類定義的欄位都不能有非空約束。如果為那些欄位添加非空約束,那麼父類的執行個體在那些列其實並沒有值,這將引起資料庫完整性衝突,導致父類的執行個體無法儲存到資料庫中


採用 joined-subclass 元素的繼承映射
  • 採用 joined-subclass 元素的繼承映射可以實現每個子類一張表
  • 採用這種映射策略時,父類執行個體儲存在父類表中,子類執行個體由父類表和子類表共同儲存。因為子類執行個體也是一個特殊的父類執行個體,因此必然也包含了父類執行個體的屬性。於是將子類和父類共有的屬性儲存在父類表中,子類增加的屬性,則儲存在子類表中。
  • 在這種映射策略下,無須使用鑒別者列,但需要為每個子類使用 key 元素映射共有主鍵。
  • 子類增加的屬性可以添加非空約束。因為子類的屬性和父類的屬性沒有儲存在同一個表中


採用 union-subclass 元素的繼承映射
  • 採用 union-subclass 元素可以實現將每一個實體物件映射到一個獨立的表中。
  • 子類增加的屬性可以有非空約束 --- 即父類執行個體的資料儲存在父表中,而子類執行個體的資料儲存在子類表中。
  • 子類執行個體的資料僅儲存在子類表中, 而在父類表中沒有任何記錄
  • 在這種映射策略下,子類表的欄位會比父類表的映射欄位要多,因為子類表的欄位等於父類表的欄位、加子類增加屬性的總和
  • 在這種映射策略下,既不需要使用鑒別者列,也無須使用 key 元素來映射共有主鍵.
  • 使用 union-subclass 映射策略是不可使用 identity 的主鍵建置原則, 因為同一類繼承層次中所有實體類都需要使用同一個主鍵種子, 即多個持久化實體對應的記錄的主鍵應該是連續的. 受此影響, 也不該使用 native 主鍵建置原則, 因為 native 會根據資料庫來選擇使用 identity 或 sequence.




三種繼承映射方式的比較



採用 subclass 元素的繼承映射
執行個體詳解:Person.java
package com.atguigu.hibernate.subclass;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;}}

Student.java
package com.atguigu.hibernate.subclass;public class Student extends Person{private String school;public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}}

Person.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.atguigu.hibernate.subclass">    <class name="Person" table="PERSONS" discriminator-value="PERSON">        <id name="id" type="java.lang.Integer">            <column name="ID" />            <generator class="native" />        </id>                <!-- 配置辨別者列 --><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>                <!-- 映射子類 Student, 使用 subclass 進行映射 -->        <subclass name="Student" discriminator-value="STUDENT">        <property name="school" type="string" column="SCHOOL"></property>        </subclass>            </class></hibernate-mapping>

package com.atguigu.hibernate.subclass;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.sql.Blob;import java.sql.Connection;import java.sql.SQLException;import java.util.Date;import java.util.List;import java.util.Set;import org.hibernate.Hibernate;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.jdbc.Work;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;public class HibernateTest {private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())                            .buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();session.close();sessionFactory.close();}/** * 缺點: * 1. 使用了辨別者列. * 2. 子類專屬的欄位不能添加非空約束. * 3. 若繼承層次較深, 則資料表的欄位也會較多.  *//** * 查詢: * 1. 查詢父類記錄, 只需要查詢一張資料表 * 2. 對於子類記錄, 也只需要查詢一張資料表 */@Testpublic void testQuery(){List<Person> persons = session.createQuery("FROM Person").list();System.out.println(persons.size()); List<Student> stus = session.createQuery("FROM Student").list();System.out.println(stus.size()); }/** * 插入操作:  * 1. 對於子類對象只需把記錄插入到一張資料表中. * 2. 辨別者列有 Hibernate 自動維護.  */@Testpublic void testSave(){Person person = new Person();person.setAge(11);person.setName("AA");session.save(person);Student stu = new Student();stu.setAge(22);stu.setName("BB");stu.setSchool("ATGUIGU");session.save(stu);}}


採用 joined-subclass 元素的繼承映射
執行個體詳解:Person.java
package com.atguigu.hibernate.joined.subclass;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;}}

Student.java
package com.atguigu.hibernate.joined.subclass;public class Student extends Person{private String school;public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}}

Person.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.atguigu.hibernate.joined.subclass">    <class name="Person" table="PERSONS">        <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="Student" table="STUDENTS">        <key column="STUDENT_id"></key>        <property name="school" type="string" column="SCHOOL"></property>        </joined-subclass>            </class></hibernate-mapping>

package com.atguigu.hibernate.joined.subclass;import java.util.List;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;public class HibernateTest {private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())                            .buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();session.close();sessionFactory.close();}/** * 優點: * 1. 不需要使用了辨別者列. * 2. 子類專屬的欄位能添加非空約束. * 3. 沒有冗餘的欄位.  *//** * 查詢: * 1. 查詢父類記錄, 做一個左外串連查詢 * 2. 對於子類記錄, 做一個內串連查詢.  */@Testpublic void testQuery(){List<Person> persons = session.createQuery("FROM Person").list();System.out.println(persons.size()); List<Student> stus = session.createQuery("FROM Student").list();System.out.println(stus.size()); }/** * 插入操作:  * 1. 對於子類對象至少需要插入到兩張資料表中.  */@Testpublic void testSave(){Person person = new Person();person.setAge(11);person.setName("AA");session.save(person);Student stu = new Student();stu.setAge(22);stu.setName("BB");stu.setSchool("ATGUIGU");session.save(stu);}}


採用 union-subclass 元素的繼承映射
Person.java
package com.atguigu.hibernate.union.subclass;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;}}

Student.java
package com.atguigu.hibernate.union.subclass;public class Student extends Person{private String school;public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}}

Person.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.atguigu.hibernate.union.subclass">    <class name="Person" table="PERSONS">        <id name="id" type="java.lang.Integer">            <column name="ID" />            <generator class="hilo" />        </id>                <property name="name" type="java.lang.String">            <column name="NAME" />        </property>                <property name="age" type="int">            <column name="AGE" />        </property><union-subclass name="Student" table="STUDENTS"><property name="school" column="SCHOOL" type="string"></property></union-subclass>                    </class></hibernate-mapping>

package com.atguigu.hibernate.union.subclass;import java.util.List;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;public class HibernateTest {private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())                            .buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();session.close();sessionFactory.close();}@Testpublic void testUpdate(){String hql = "UPDATE Person p SET p.age = 20";session.createQuery(hql).executeUpdate();}/** * 優點: * 1. 無需使用辨別者列. * 2. 子類專屬的欄位能添加非空約束. *  * 缺點: * 1. 存在冗餘的欄位 * 2. 若更新父表的欄位, 則更新的效率較低 *//** * 查詢: * 1. 查詢父類記錄, 需把父表和子表記錄匯總到一起再做查詢. 效能稍差.  * 2. 對於子類記錄, 也只需要查詢一張資料表 */@Testpublic void testQuery(){List<Person> persons = session.createQuery("FROM Person").list();System.out.println(persons.size()); List<Student> stus = session.createQuery("FROM Student").list();System.out.println(stus.size()); }/** * 插入操作:  * 1. 對於子類對象只需把記錄插入到一張資料表中. */@Testpublic void testSave(){Person person = new Person();person.setAge(11);person.setName("AA");session.save(person);Student stu = new Student();stu.setAge(22);stu.setName("BB");stu.setSchool("ATGUIGU");session.save(stu);}}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.