一:用一张表映射
people.java
public class People {
private int id;
private String name;
private String workage;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWorkage() {
return workage;
}
public void setWorkage(String workage) {
this.workage = workage;
}
}
YoungPerson.java
public class YoungPerson extends People{
/*
*助学基金
*/
private String studentgrant;
public String getStudentgrant() {
return studentgrant;
}
public void setStudentgrant(String studentgrant) {
this.studentgrant = studentgrant;
}
}
AdultPerson.java
public class AdultPerson extends People{
/*
*工资
*/
private String adultsalary;
public String getAdultsalary() {
return adultsalary;
}
public void setAdultsalary(String adultsalary) {
this.adultsalary = adultsalary;
}
}
OldPerson.java
public class OldPerson extends People{
/*
*养老金
*/
private String annuity;
public String getAnnuity() {
return annuity;
}
public void setAnnuity(String annuity) {
this.annuity = annuity;
}
}
people.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernatedemo1.pojo">
<class name="People" table="people">
<id name="id">
<generator class="increment"></generator>
</id>
<!-- 指定一个鉴别器 -->
<discriminator type="string" column="style"></discriminator>
<property name="name"/>
<property name="workage"/>
<!-- discriminator-value:识别子类 -->
<subclass name="YoungPerson" discriminator-value="Y">
<property name="studentgrant" ></property>
</subclass>
<subclass name="AdultPerson" discriminator-value="a">
<property name="adultsalary" ></property>
</subclass>
<subclass name="OldPerson" discriminator-value="O">
<property name="annuity" ></property>
</subclass>
</class>
</hibernate-mapping>
测试类;
Demo.java
public class demo(){
Configuration cfg = new Configuration().configure();
ServiceRegistry registry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
SessionFactory sf=cfg.buildSessionFactory(registry);
//代开session(建立和数据库之间的连接)
Session session=sf.openSession();
//开始事物
Transaction tx=session.beginTransaction();
YoungPerson yp=new YoungPerson();
yp.setName("小明");
yp.setWorkage("9");
yp.setStudentgrant("九年义务教育");
session.saveOrUpdate(yp);
AdultPerson ap=new AdultPerson();
ap.setName("张霞");
ap.setWorkage("28");
ap.setAdultsalary("工资");
session.saveOrUpdate(ap);
OldPerson op=new OldPerson();
op.setName("老明");
op.setWorkage("60");
op.setAnnuity("养老金");
session.saveOrUpdate(op);
tx.commit();
session.close();
}
**二:继承映射的第二种方法:用多张表映射,每张表只有自己独立的信息,没有公共字段!
映射情景回顾以及各实体类在这里就不重复写了,(因为只有xml发生了改变)**
people.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernatedemo1.pojo">
<class name="People" table="people">
<id name="id">
<generator class="increment"></generator>
</id>
<!-- 指定一个鉴别器 -->
<discriminator type="string" column="style"></discriminator>
<property name="name"/>
<property name="workage"/>
<joined-subclass name="YoungPerson" table="youngperson">
<key column="id"></key>
<property name="studentgrant" ></property>
</joined-subclass>
<joined-subclass name="AdultPerson" table="adultperson">
<key column="id"></key>
<property name="adultsalary" ></property>
</joined-subclass>
<joined-subclass name="OldPerson" table="oldperson">
<key column="id"></key>
<property name="annuity" ></property>
</joined-subclass>
</class>
</hibernate-mapping>
**三:继承映射的第二种方法:用多张表映射,每张表都有公共字段!
映射情景回顾以及各实体类在这里就不重复写了,(因为只有xml发生了改变)**
people.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernatedemo1.pojo">
<class name="People" table="people">
<id name="id">
<generator class="increment"></generator>
</id>
<property name="name"/>
<property name="workage"/>
<!--
当使用每个具体类一张表的方式时,主键生成策略不能是identity。
因为在整个继承结构中,主键值是不能重复的。
=================================================
假设如果是identity,那么在数据库中的主键是数据库自己生成的,那么在表中就可能会有一个ID等于1的Topic和ID等于1的Reply
假设现在用ID=1和Article类型查数据库,那么我们就不能知道这个查回来的是主题还是回复。因为这是继承多态的特性。
=================================================
但是在前面两种情况中都不会,因为他的主键是根据父类表Article生成的外键,是引用的,因此不会出现ID重复的情况。
-->
<union-subclass name="YoungPerson" table="youngperson">
<property name="studentgrant" ></property>
</union-subclass>
<union-subclass name="AdultPerson" table="adultperson">
<property name="adultsalary" ></property>
</union-subclass>
<union-subclass name="OldPerson" table="oldperson">
<property name="annuity" ></property>
</union-subclass>
</class>
</hibernate-mapping>