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


}

五、数据库生成数据

猜你喜欢

转载自blog.csdn.net/m0_38068812/article/details/83834032
今日推荐