Hibernate 三种方式实现 继承映射
继承映射:即保存父子类时数据冗余问题
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();
}
}