Hibernate学习笔记六

继承映射:

 

1) 每个子类一张表

父类:

Person.java:

   private String id;

   private String name;

为其生成setget方法

子类:

Student.java:

   private String cardId;

为其生成setget方法

Teacher.java:

   private int salary;

为其生成setget方法

Student.hbm.xml:

<class name="com.songjinghao.hibernate.Student"table="student">

      <id name="id"column="id" type="string">

        <generator class="uuid"></generator>

      </id>

      <property name="name"column="name" type="string"></property>

      <property name="cardId"column="cardId" type="string"></property>

</class>

Teacher.hbm.xml:

<class name="com.songjinghao.hibernate.Teacher"table="teacher">

      <id name="id"column="id" type="string">

        <generator class="uuid"></generator>

      </id>

      <property name="name"column="name" type="string"></property>

      <property name="salary"column="salary" type="integer"></property>

</class>

HibernateTest.java:

//      Student student = new Student();

//      student.setCardId("123456");

//       student.setName("zhangsan");

//      Teacher teacher = new Teacher();

//      teacher.setSalary(1000);

//      teacher.setName("lisi");

//      session.save(student);

//      session.save(teacher);

        //配置文件中没有Person的映射文件,因此需要在类名前加上包名

        Query query = session.createQuery("from com.songjinghao.hibernate.Person"); //多态查询

        Iterator iter = query.iterate();

        while(iter.hasNext())

        {

           Person p = (Person)iter.next();

           System.out.println(p.getName());

        }

2) 一张表存储继承体系中所有类的信息(数据库表实际上是继承体系中所有类的属性的并集所构成的字段)

Hibernate学习笔记六_第1张图片

Person.javaStudent.javaTeacher.java代码与1)一样。

Person.hbm.xml:

<class name="com.songjinghao.hibernate.Person"table="person">

      <id name="id"column="id" type="string">

        <generator class="uuid"></generator>

      </id>

      <discriminator column="personType"type="string"></discriminator>

      <property name="name"column="name" type="string"></property>

      <subclass name="com.songjinghao.hibernate.Student"discriminator-value="student">

        <property name="cardId"type="string"></property>

      </subclass>

      <subclass name="com.songjinghao.hibernate.Teacher"discriminator-value="teacher">

        <property name="salary"type="integer"></property>

      </subclass>

</class>

需要在hbm文件中增加如下一行:

<discriminator column="personType"type="string"></discriminator>

数据库效果图:

 HibernateTest.java:

//      Student student = new Student();

//      student.setCardId("123456");

//      student.setName("zhangsan");

//      Teacher teacher = new Teacher();

//      teacher.setSalary(1000);

//      teacher.setName("lisi");

//      session.save(student);

//      session.save(teacher);

        Query query =session.createQuery("from Person"); //多态查询

        List list = query.list();

        for(int i = 0; i < list.size(); i++)

        {

           if(list.get(i) instanceof Student)

           {

              System.out.println(((Student)list.get(i)).getCardId());;

           }

           if(list.get(i) instanceof Teacher)

           {

              System.out.println(((Teacher)list.get(i)).getSalary());;

           }

        }

3) 公共信息放在父类表中,独有信息放在子类表中,每个子类对应

一张表。

Hibernate学习笔记六_第2张图片

Person.java Student.java Teacher.java 代码与 1) 一样。

Person.hbm.xml:

<class name="com.songjinghao.hibernate.Person"table="person">

      <id name="id"column="id" type="string">

        <generator class="uuid"></generator>

      </id>

      <property name="name"type="string"></property>

      <joined-subclass name="com.songjinghao.hibernate.Student"table="student">

        <key column="id"></key>

        <property name="cardId"type="string"></property>

      </joined-subclass>

      <joined-subclass name="com.songjinghao.hibernate.Teacher"table="teacher">

        <key column="id"></key>

        <property name="salary"type="integer"></property>

      </joined-subclass>

</class>

总结:

第一种方式:一个子类一张表,结构比较清晰。

第二种方式:从简单角度看,此方式只有一张表,配置起来比较简单,不需要多余的表,但是却浪费了数据库空间,如果子类多的情况下,会有大量空的存储。

第三种方式:需要进行表的连接查询,在一定程度上会损耗数据库的性能。

三种方式都有优点也都有缺点,没有哪一种是完美的,视情况使用合适的方式。


你可能感兴趣的:(Hibernate学习笔记六)