Person.java
/* * Hibernate - 繼承映射(每個具體類一個表) * 創建日期 2005-4-9 * @author javamxj(分享java快樂) * @link Blog: htpp://javamxj.mblogger.cn * htpp://blog.csdn.net/javamxj/ */ package javamxj.inheritance.three; public class Person { private Long id; private String name; /** * @hibernate.id * column="ID" * generator-class="hilo" * unsaved-value="null" */ public Long getId() { return id; } public void setId(Long id) { this.id = id; } /** * @hibernate.property * length = "24" */ public String getName() { return name; } public void setName(String name) { this.name = name; } }
Student.java |
package javamxj.inheritance.three; /** * @hibernate.class * table="Student" */ public class Student extends Person { private String studentNumber; /** * @hibernate.property * length = "24" */ public String getStudentNumber() { return studentNumber; } public void setStudentNumber(String studentNumber) { this.studentNumber = studentNumber; } } |
Professor.java |
package javamxj.inheritance.three; /** * @hibernate.class * table="Professor" */ public class Professor extends Person { private int salary; /** * @hibernate.property */ public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } } |
Professor.hbm.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping > <class name="javamxj.inheritance.three.Professor" table="Professor" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version" > <id name="id" column="ID" type="java.lang.Long" unsaved-value="null" > <generator class="hilo"> <!-- To add non XDoclet generator parameters, create a file named hibernate-generator-params-Professor.xml containing the additional parameters and place it in your merge dir. --> </generator> </id> <property name="salary" type="int" update="true" insert="true" access="property" column="salary" /> <property name="name" type="java.lang.String" update="true" insert="true" access="property" column="name" length="24" /> <!-- To add non XDoclet property mappings, create a file named hibernate-properties-Professor.xml containing the additional properties and place it in your merge dir. --> </class> </hibernate-mapping>
Student.hbm.xml
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping > <class name="javamxj.inheritance.three.Student" table="Student" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version" > <id name="id" column="ID" type="java.lang.Long" unsaved-value="null" > <generator class="hilo"> <!-- To add non XDoclet generator parameters, create a file named hibernate-generator-params-Student.xml containing the additional parameters and place it in your merge dir. --> </generator> </id> <property name="studentNumber" type="java.lang.String" update="true" insert="true" access="property" column="studentNumber" length="24" /> <property name="name" type="java.lang.String" update="true" insert="true" access="property" column="name" length="24" /> <!-- To add non XDoclet property mappings, create a file named hibernate-properties-Student.xml containing the additional properties and place it in your merge dir. --> </class> </hibernate-mapping>
<mapping resource="javamxj/inheritance/three/Student.hbm.xml"/>
ID bigint not null,
studentNumber varchar(24),
name varchar(24),
primary key (ID)
)
ID bigint not null,
salary integer,
name varchar(24),
primary key (ID)
)
Demo.java
/* * Hibernate - 繼承映射(每個具體類一個表) * 創建日期 2005-4-9 * @author javamxj(分享java快樂) * @link Blog: htpp://javamxj.mblogger.cn * htpp://blog.csdn.net/javamxj/ */ package javamxj.inheritance.three; import java.util.Iterator; import java.util.List; import net.sf.hibernate.HibernateException; import net.sf.hibernate.Session; import net.sf.hibernate.SessionFactory; import net.sf.hibernate.Transaction; import net.sf.hibernate.cfg.Configuration; public class Demo { public static void main(String[] args) { try { new Demo(); } catch (HibernateException he) { he.printStackTrace(); } } public Demo() throws HibernateException { SessionFactory sf = new Configuration().configure() .buildSessionFactory(); Session sess = sf.openSession(); Transaction tx = null; try { tx = sess.beginTransaction(); Student student = new Student(); student.setName("張三"); student.setStudentNumber("1234554321"); sess.save(student); Professor professor = new Professor(); professor.setName("李四"); professor.setSalary(4300); sess.save(professor); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); throw e; } finally { sess.close(); } sess = sf.openSession(); tx = null; try { tx = sess.beginTransaction(); List person = sess.find("from " + Person.class.getName()); for (Iterator it = person.iterator(); it.hasNext();) { Person p = (Person) it.next(); System.out.println("人員 '" + p.getName() + "' its class is: " + p.getClass().getName()); } tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); throw e; } finally { sess.close(); } } }
· 報表操作實現簡單:表中包含了具體子類的所有信息。
● 缺點:
· 類的修改會導致相對應的表及其子類所對應表的更改。
· 當含有多重子類時,會造成在數據庫表格中生成重複的字段。