Hibernate 继承关系(泛化关系)

一、介绍

   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();
    }


}

五、数据库生成数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值