一、介绍
one-table映射继承的优劣势:
优点:非常简单;多态查询非常快;
缺点:表及其不稳定;数据分布不好;空值较多;没法实现一些非空的约束;
1,在hibernate中,继承只需要映射一个类就可以了,映射是整个继承体系的根类;
2,使用一张表完成继承映射,我们把这种映射方式称为ONE-TABLE;
3,子类都是使用<subclass>直接映射在根类的映射元素中;
4,子类不需要映射父类已经拥有的属性(不要再去映射id);
5,子类的自己的属性就是直接映射在自己的subclass之中;
6,需要声明一个鉴别器(discriminator),定义鉴别器列的类型和名称;
7,在每一个类上,要配置一个鉴别器的值;
二、配置文件
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory >
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedemo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- show_sql: 操作数据库时,会 向控制台打印sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- format_sql: 打印sql语句前,会将sql语句先格式化 -->
<!--<property name="hibernate.format_sql">true</property>-->
<mapping resource="com/shenzhenair/day03/extend/extend.hbm.xml"/>
</session-factory>
</hibernate-configuration>
extend.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.shenzhenair.day03.extend" >
<class name="Product" discriminator-value="1" >
<id name="id" >
<generator class="native"/>
</id>
<!--鉴别器-->
<discriminator column="types" type="int" />
<property name="name" />
<subclass name="BookProduct" discriminator-value="2" >
<property name="isbn" />
<property name="author" />
</subclass>
<subclass name="ClothProduct" discriminator-value="3" >
<property name="size" />
<property name="color" />
</subclass>
</class>
</hibernate-mapping>
三、实体类
@Setter
@Getter
public class BookProduct extends Product {
private String isbn;
private String author;
}
@Setter
@Getter
public class ClothProduct extends Product{
private String size;
private String color;
}
@Setter
@Getter
public class Product {
private Long id;
private String name;
}
四、测试类
**
* 继承测试
*/
public class ExtendTest {
@Test
public void testSave(){
Product p = new Product();
p.setName("p");
BookProduct bp = new BookProduct();
bp.setName("bp");
bp.setAuthor("author");
bp.setIsbn("isbn");
ClothProduct cp = new ClothProduct();
cp.setColor("yellow");
cp.setSize("50");
cp.setName("cp");
Session session = HibernateUtils.openSession();
session.beginTransaction();
session.save(p);
session.save(bp);
session.save(cp);
session.getTransaction().commit();
session.close();
}
@Test
public void testGet(){
Session session = HibernateUtils.openSession();
BookProduct bp = (BookProduct) session.get(BookProduct.class, 2L);
System.out.println(bp);
session.close();
}
/**
* 多态查询:查询的时候按照父类型查询,查出来的结果是真实的类型
*/
@Test
public void testGet2(){
Session session = HibernateUtils.openSession();
Product p = (Product) session.get(Product.class, 3L);
System.out.println(p);
session.close();
}
}
五、数据库生成数据