继承映射分为三种情况
1.每个子类一张表
比如说有一个Person父类,有一个Student子类,一个Teacher子类。
假如我们操作的都是Student子类或者Teacher子类,就要为Teacher和Student各建立一张表。
Person类中有一些属性,被Student和Teacher继承下来。
而Student和Teacher有自己的属性,比如salaray和score.
类声明:
/**
* Person作为父类
*/
public class Person
{
private String id;
private String name;
}
/**
* 继承父类Person
*/
public class Student extends Person
{
private String cardId;
}
public class Teacher extends Person
{
private int salary;
}
根据继承原则,私有属性不能被继承。但是在我们声明Person类的时候,由于里面的getter和setter都是public,因此当在Student.hbm.xml中使用代码提示的时候,就可以看到:
这是因为Hibernate获取我们的映射对象名称是根据方法名的。具体操作方法在之前反射的内容
http://alleni123.iteye.com/admin/blogs/1965343中提到过。
Teacher.hbm.xml和Student.hbm.xml
<hibernate-mapping package="extend_mapping">
<class name="Teacher" table="test_teacher">
<id name="id" column="id" type="string">
<generator class="uuid"></generator>
</id>
<property name="name" column="name" type="string"/>
<property name="salary" column="salary" type="int"/>
</class>
</hibernate-mapping>
<!--========================-->
<hibernate-mapping package="extend_mapping">
<class name="Student" table="test_student">
<id name="id" column="id" type="string">
<generator class="uuid"></generator>
</id>
<property name="name" column="name" type="string"/>
<property name="cardId" column="cardId" type="string"></property>
</class>
</hibernate-mapping>
最后生成SQL语句:
Hibernate: create table test_student (id varchar2(255 char) not null, name varchar2(255 char), cardId varchar2(255 char), primary key (id))
Hibernate: create table test_teacher (id varchar2(255 char) not null, name varchar2(255 char), salary number(10,0), primary key (id))
插入
Session session=HibernateUtil.openSession();
Student s=new Student();
s.setCardId("111");
s.setName("alleni");
Teacher teacher=new Teacher();
teacher.setSalary(1000);
teacher.setName("eline");
session.save(s);
session.save(teacher);
Transaction tx=session.beginTransaction();
tx.commit();
生成数据:
查询
由于Student和Teacher表都有name, 我们会想查询两个表中的所有的name列内容。
因此这里要使用
多态查询,如下:
Query query=session.createQuery("from Person");
'from Person'表示将继承了Person的类所映射的表全部查询出来。
注意:
List l=query.list();
这里会报错,
org.hibernate.hql.internal.ast.QuerySyntaxException: Person is not mapped [from Person]
原因是这里我们并没有定义Person的hbm文件。
解决方法是将Person的package名称加进查询语句中:
Query query=session.createQuery("from extend_mapping.Person");
完整代码如下:
Session session=HibernateUtil.openSession();
//多态查询
Query query=session.createQuery("from extend_mapping.Person");
Iterator it=query.iterate();
while(it.hasNext()){
Person p=(Person) it.next();
System.out.println(p.getClass().getName());
System.out.println(p.getName());
}
// List<Person> l=query.list();
//
// System.out.println(l.size());
//
// for(Person p:l){
// System.out.println(p.getName());
// }
这里while循环语句输出如下:
Hibernate: select teacher0_.id as col_0_0_ from test_teacher teacher0_
Hibernate: select student0_.id as col_0_0_ from test_student student0_
extend_mapping.Teacher
eline
extend_mapping.Student
alleni
这里Hibernate分别向Person的两个子类中的对应的表发了SQL查询语句。
获取的内容也被Hibernate封装到了对应Class的类对象中。