单表继承
关系图:
具体实现
1、实体
Animal:
/**
* 父类Animal实体
* @author gxq
*
*/
public class Animal {
//定义id、名称、性别
private int id;
private String name;
private boolean sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
}
Pig:
/**
* 子类Pig
* @author gxq
*
*/
public class Pig extends Animal {
//重量
private String weight;
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
}
Bird:
/**
* 子类Bird
* @author gxq
*
*/
public class Bird extends Animal {
//高度
private String height;
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
}
2、映射文件
<hibernate-mapping package="com.bjpowernode.inherit">
<class name="Animal" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<!-- 公共属性映射 -->
<discriminator column="type" type="string"></discriminator>
<property name="name"/>
<property name="sex"></property>
<!-- Pig特有属性映射 -->
<subclass name="Pig" discriminator-value="P">
<property name="weight"></property>
</subclass>
<!-- Bird特有属性映射 -->
<subclass name="Bird" discriminator-value="B">
<property name="height"></property>
</subclass>
</class>
</hibernate-mapping>
注:
Discriminator映射:就是把一个表应射程不同的类,有不同的属性</span>
3、配置文件(hibernate.cfg.xml)
<span style="font-size:18px;"> <hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/Hibernate?useUnicode=true&characterEncoding=utf8]]>
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/bjpowernode/inherit/Animal.hbm.xml"/>
</session-factory>
</hibernate-configuration></span><span style="font-size: 18px; font-family: SimSun;"> </span>
4、封装好的工具类:HibernateUtils
<span style="font-size:18px;"> /**
* 工具类(封装开启session和事务)
* @classname HibernateUtils
* @author 高晓青
* @date 2015-4-16 下午2:56:42
* @version hibernate
*/
public class HibernateUtils {
private static SessionFactory factory;
static{
try {
//默认读取的是hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
//建立sessionFactory
factory = cfg.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
//开启session
public static Session getSession(){
return factory.openSession();
}
//关闭session
public static void closeSession(Session session){
//判断是否为空
if(session!=null){
//判断是否是打开状态再进行关闭
if(session.isOpen()){
session.close();
}
}
}
}
</span>
5、添加
<span style="font-size:18px;"> public void testSingle(){
Session session=null;
try {
session=HibernateUtils.getSession();
session.beginTransaction();
//实例化Pig
Pig pig=new Pig();
pig.setName("小猪猪");
pig.setSex(true);
pig.setWeight("100斤");
session.save(pig);
//实例化Bird
Bird bird=new Bird();
bird.setName("小鸟鸟");
bird.setSex(false);
bird.setHeight("200米");
session.save(bird);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
}
}
</span>
6、查询
情况1:
<span style="font-size:18px;"> /**
* 根据子类Pig的id查询
*/
public void testLoad1(){
Session session=null;
try {
//获取session,打开事务
session=HibernateUtils.getSession();
session.beginTransaction();
//根据id查询
Pig pig=(Pig) session.load(Pig.class,1);
System.out.println(pig.getName());
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
</span>
情况2:
<span style="font-size:18px;"> /**
* 根据父类Animal查询
*/
public void testLoadAnimal(){
Session session=null;
try {
//获取session,打开事务
session=HibernateUtils.getSession();
session.beginTransaction();
//根据id查询
Animal animal=(Animal) session.load(Animal.class,1);
System.out.println(animal.getName());
//提交事务
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}</span>
类表继承
关系图
具体实现
1、实体
与单表继承一致
2、映射文件
<span style="font-size:18px;"> <hibernate-mapping package="com.bjpowernode.inherit">
<class name="Animal" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<!-- 公共属性映射 -->
<property name="name"/>
<property name="sex"></property>
<!-- Pig为单独一张表 -->
<joined-subclass name="Pig" table="t_pig">
<key column="pid"></key>
<property name="weight"></property>
</joined-subclass>
<!-- Bird为单独一张表 -->
<joined-subclass name="Bird" table="t_bird">
<key column="bid"></key>
<property name="height"></property>
</joined-subclass>
</class>
</hibernate-mapping></span>
3、配置文件
与单表继承一致
4、封装好的工具类:HibernateUtils
与单表继承一致
5、添加
public void testClass(){
Session session=null;
try {
session=HibernateUtils.getSession();
session.beginTransaction();
//实例化Pig
Pig pig=new Pig();
pig.setName("小猪猪");
pig.setSex(true);
pig.setWeight("100斤");
session.save(pig);
//实例化Bird
Bird bird=new Bird();
bird.setName("小鸟鸟");
bird.setSex(false);
bird.setHeight("200米");
session.save(bird);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
}
}
6、查询
/**
* 根据子类Pig的id查询
*/
public void testLoad1(){
Session session=null;
try {
//获取session,打开事务
session=HibernateUtils.getSession();
session.beginTransaction();
//根据id查询
Pig pig=(Pig) session.load(Pig.class,1);
System.out.println(pig.getName());
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
具体表继承
关系图
具体实现
1、实体、配置问题件、封装好的工具类:HibernateUtils:与单表继承一致
2、映射文件
<hibernate-mapping package="com.bjpowernode.inherit">
<class name="Animal" table="t_animal" abstract="true">
<id name="id">
<generator class="assigned"/>
</id>
<!-- 公共属性映射 -->
<property name="name"/>
<property name="sex"></property>
<!-- Pig为单独一张表 -->
<union-subclass name="Pig" table="t_pig">
<property name="weight"></property>
</union-subclass>
<!-- Bird为单独一张表 -->
<union-subclass name="Bird" table="t_bird">
<property name="height"></property>
</union-subclass>
</class>
</hibernate-mapping>
注:
(1)主键必须为手动分配
(2)配置文件中加入abstract="true",生成2张子表,不生成父表;如不加则会生成3张表
3、添加
<span style="font-size:18px;"> public void testSingle(){
Session session=null;
try {
session=HibernateUtils.getSession();
session.beginTransaction();
//实例化Pig
Pig pig=new Pig();
pig.setId(1);
pig.setName("小猪猪");
pig.setSex(true);
pig.setWeight("100斤");
session.save(pig);
//实例化Bird
Bird bird=new Bird();
bird.setId(2);
bird.setName("小鸟鸟");
bird.setSex(false);
bird.setHeight("200米");
session.save(bird);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
}
}</span>
情况1:生成父类表
情况2:不生成父类
在配置文件中加入:abstract="true"
区别
单表继承(1张表)
原则:
所有数据存储在一张表中
特点:
引入区分子类的字段
若涉及到的类有很多字段,则放到一张表里的话,这张表里会有非常多的字段,存储数据时,很多字段都是NULL!
类表继承(3张表)
原则:
每个子类一张表,但这些子类对应的表都关联到基类所对应的表中
特点:
完全符合关系模型的设计原则,且不存在冗余,
具体表继承:(2/3张表)
原则:
每个子类一张表,父类可有,也可设置无
特点:
不支持identity生成策略,要求整个继承结构即所有表所有记录的id不能重复