Hibernate 三种方式实现 继承映射

Hibernate 3种方式实现 继承映射

继承映射:即保存父子类时数据冗余问题

 

1.所有父子类共享同一张表,每条记录拥有所有属性字段,另外还需要指定一个标识字段用来区别不同子类

       优点:易于查询缺点:冗余字段太多

 

实现:

实体类(父类User,子类Vip,子类Admin)均省略无参构造函数和setter/getter

public class User {

      private int userid;

      private String username;

      private String password;

}

public class Admin extends User {

      private int level;

}

public class Vip extends User {

      private int balance;

}

  

使用一个映射文件User.hbm.xml

<hibernate-mapping package="entity">   <!--别忘为父类指定标识符,默认全类名-->

 <class name="User" table="sub_user" discriminator-value="user">

       <id name="userid">

             <generator class="native"></generator>

       </id>

            <!--子类类型标识符,必须写在id下面-->

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

       <property name="username"></property>

       <property name="password"></property>

       <subclass discriminator-value="vip" name="Vip">

             <property name="balance"></property>

       </subclass>

       <subclass discriminator-value="admin" name="Admin">

             <property name="level"></property>

       </subclass>  <!--子类-->

 </class>

</hibernate-mapping>

  

 

方法二:

所有用户信息保存在user表中,各子类拥有的个性字段使用单独的表来保存 ,所有用户都在父类表中拥有一条记录

配置文件user.hbm.xml

<hibernate-mapping package="entity">

 <class name="User" table="sub_user">

       <id name="userid">

             <generator class="native"></generator>

       </id>

       <property name="username"></property>

       <property name="password"></property>

            <!--指定子类的表名-->

       <joined-subclass table="vip_user" name="Vip">

                        <!--key指定的列名为此子类到父类的外键引用-->

             <key column="userid"></key>

             <property name="balance"></property>

       </joined-subclass>

       <joined-subclass table="admin_user" name="Admin">

             <key column="userid"></key>

             <property name="level"></property>

       </joined-subclass>

 </class>

</hibernate-mapping>

 方法三:各子类和父类都使用不同的表,有x个子类,就创建x+1个映射文件,麻烦,这个不写了

 

测试代码:

 

 public static void main(String[] args) {

            User tom = new User();

            Vip jack = new Vip();

            Admin lee = new Admin();

            

            tom.setPassword("tompass");

            jack.setPassword("jackpass");

            lee.setPassword("leepass");

            

            tom.setUsername("tom");

            jack.setUsername("jack");

            lee.setUsername("lee");

            

            jack.setBalance(100); //vip

            lee.setLevel(20); //admin

            

            Session ss = null;

            Transaction ts = null;

            try{

                  ss = DBFactory.sf.openSession();

                  ts = ss.beginTransaction();

                  ss.save(tom);

                  ss.save(jack);

                  ss.save(lee);

                  ts.commit();

                  ss.close();

            }catch(Exception e){

                  ts.rollback();

                  e.printStackTrace();

            }

      }