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