Hibernate学习-10-组件映射和继承映射

类的关系

    组合关系

       一个类中包含了另一个类。这两个类就是组合关系

    继承关系

      一个类继承一个关系

组件映射

com.cx.component.Car

package com.cx.component;

/**
 * Created by cxspace on 16-8-3.
 */
public class Car {

    private int id;

    private String name;

    private Wheel wheel;

    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 Wheel getWheel() {
        return wheel;
    }

    public void setWheel(Wheel wheel) {
        this.wheel = wheel;
    }
}

com.cx.component.Wheel

package com.cx.component;

/**
 * Created by cxspace on 16-8-3.
 */
public class Wheel {

    private int count;
    private int size;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}

com/cx/component/Car.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">


<hibernate-mapping package="com.cx.component">

    <class name="Car" table="t_car">
        <id name="id">
            <generator class="native"></generator>
        </id>

        <property name="name" length="20"></property>

        <!--组件映射-->

        <component name="wheel">
            <property name="size"></property>
            <property name="count"></property>
        </component>

    </class>

</hibernate-mapping>

测试类
package
com.cx.component; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * Created by cxspace on 16-8-3. */ public class Test { private static SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Car.class) .buildSessionFactory(); } @org.junit.Test public void save(){ Session session = sf.openSession(); session.beginTransaction(); Wheel wheel = new Wheel(); wheel.setCount(2); wheel.setSize(37); Car car = new Car(); car.setName("路虎"); car.setWheel(wheel); session.save(car); session.getTransaction().commit(); session.close(); /* * * Hibernate: insert into t_car (name, size, count) values (?, ?, ?) * */ } }

继承映射

一.简单的继承映射实例

com.cx.extend1.Animal

package com.cx.extend1;

/**
 * Created by cxspace on 16-8-4.
 */
public class Animal {

    private int id;
    private String name;

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

com.cx.extend1.Cat

package com.cx.extend1;

/**
 * Created by cxspace on 16-8-4.
 */
public class Cat extends Animal{

    private String catchMouse;

    public String getCatchMouse() {
        return catchMouse;
    }

    public void setCatchMouse(String catchMouse) {
        this.catchMouse = catchMouse;
    }
}

com/cx/extend1/Cat.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.cx.extend1">

    <class name="Cat" table="t_Cat">

        <!--父类属性直接写,每个对象写一个映射文件-->
        <id name="id">
            <generator class="native"></generator>
        </id>

        <property name="name"></property>

        <property name="catchMouse"></property>
    </class>

</hibernate-mapping>

com.cx.extend1.Test

package com.cx.extend1;

import org.apache.jasper.tagplugins.jstl.core.Catch;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import java.util.List;

/**
 * Created by cxspace on 16-8-4.
 */
public class Test {
    private static SessionFactory sf;

    static {
        sf = new Configuration().configure().addClass(Cat.class).buildSessionFactory();
    }

    @org.junit.Test
    public void save(){

        Session session = sf.openSession();
        session.beginTransaction();


//        Cat cat = new Cat();
//        cat.setName("大花猫");
//        cat.setCatchMouse("抓老鼠");
//        session.save(cat);

        /*
        * Hibernate:
            insert
            into
                t_Cat
                (name, catchMouse)
            values
                (?, ?)
        *
        *
        * */



        /*
            当用hql查询的时候,通过父类查询必须写上类的全名
         */

        Query q = session.createQuery("from com.cx.extend1.Animal");

        List<Animal> list = q.list();

        System.out.println(list);

        /*
        *
        * Hibernate:
                select
                    cat0_.id as id0_,
                    cat0_.name as name0_,
                    cat0_.catchMouse as catchMouse0_
                from
                    t_Cat cat0_
            [com.cx.extend1.Cat@3c947bc5]
        *
        * */

        session.getTransaction().commit();
        session.close();
    }
}

二.所有的子类都映射到一张表实例

com.cx.extend2.Animal

package com.cx.extend2;

/**
 * Created by cxspace on 16-8-4.
 */
public class Animal {
    private int id;
    private String name;


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

}

com.cx.extend2.Cat

package com.cx.extend2;

/**
 * Created by cxspace on 16-8-4.
 */
public class Cat extends Animal{
    private String catchMouse;

    public String getCatchMouse() {
        return catchMouse;
    }

    public void setCatchMouse(String catchMouse) {
        this.catchMouse = catchMouse;
    }

}

com.cx.extend2.Monkey

package com.cx.extend2;

/**
 * Created by cxspace on 16-8-4.
 */
public class Monkey extends Animal{
    // 吃香蕉
    private String eatBanana;

    public String getEatBanana() {
        return eatBanana;
    }

    public void setEatBanana(String eatBanana) {
        this.eatBanana = eatBanana;
    }

}

com/cx/extend2/Animal.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
   继承映射-所有的子类都映射到一张表
-->

<hibernate-mapping package="com.cx.extend2">

    <class name="Animal" table="t_animal">
        <id name="id">
            <generator class="native"></generator>
        </id>

        <!--指定鉴别器字段(用来区分不同的子类)-->
        <discriminator column="type_"></discriminator>

        <property name="name"></property>

        <!--
           子类:猫

               每个子类都要用subclass节点映射
               一定要指定鉴别器字段,否则报错!
                鉴别器字段
                discriminator-value="cat_"
                指定总表鉴别器字段的值
        -->
        <subclass name="Cat" discriminator-value="cat_">
            <property name="catchMouse"></property>
        </subclass>

        <!--
          猴子子类
        -->

        <subclass name="Monkey" discriminator-value="monkey_">
            <property name="eatBanana"></property>
        </subclass>

    </class>

</hibernate-mapping>

com.cx.extend2.Test

package com.cx.extend2;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Created by cxspace on 16-8-4.
 */
public class Test {
    private static SessionFactory sf;
    static {
        sf = new Configuration()
                .configure()
                .addClass(Animal.class)
                .buildSessionFactory();
    }

    @org.junit.Test
    public void save(){

        Session session = sf.openSession();
        session.beginTransaction();

        Cat cat = new Cat();
        cat.setName("大话猫");
        cat.setCatchMouse("抓老鼠");

        Monkey m = new Monkey();
        m.setName("猴子");
        m.setEatBanana("吃香蕉");

        session.save(cat);
        session.save(m);

        /*
        *
        *
        *   Hibernate:
                insert
                into
                    t_animal
                    (name, catchMouse, type_)
                values
                    (?, ?, 'cat_')
            Hibernate:
                insert
                into
                    t_animal
                    (name, eatBanana, type_)
                values
                    (?, ?, 'monkey_')

        *
        *
        * */

        session.getTransaction().commit();
        session.close();
    }
}

三.一个对象映射一张表

实体类

package com.cx.extend3;

/**
 * Created by cxspace on 16-8-4.
 */
public class Animal {

    private int id;
    private String name;


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

}

package com.cx.extend3;

/**
 * Created by cxspace on 16-8-4.
 */
public class Cat extends Animal{
    // 抓老鼠
    private String catchMouse;

    public String getCatchMouse() {
        return catchMouse;
    }

    public void setCatchMouse(String catchMouse) {
        this.catchMouse = catchMouse;
    }

}

package com.cx.extend3;

/**
 * Created by cxspace on 16-8-4.
 */
public class Monkey extends Animal{

    // 吃香蕉
    private String eatBanana;

    public String getEatBanana() {
        return eatBanana;
    }

    public void setEatBanana(String eatBanana) {
        this.eatBanana = eatBanana;
    }


}

映射配置

com/cx/extend3/Animal.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
   继承映射-每个类对应一张表(父类也要对应表)
-->

<hibernate-mapping package="com.cx.extend3">
    <class name="Animal" table="t_animal">
        <id name="id">
            <generator class="native"></generator>
        </id>

        <property name="name"></property>

        <!--
          子类-猫对应表t_cat
          key 指定t_cat表的外键字段
        -->
        <joined-subclass name="Cat" table="t_cat">
            <key column="t_animal_id"></key>
            <property name="catchMouse"></property>
        </joined-subclass>

        <joined-subclass name="Monkey" table="t_monkey">
            <key column="t_animal_id"></key>
            <property name="eatBanana"></property>
        </joined-subclass>

    </class>

</hibernate-mapping>

测试

package com.cx.extend3;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Created by cxspace on 16-8-4.
 */
public class Test {
    private static SessionFactory sf;
    static {
        sf = new Configuration()
                .configure()
                .addClass(Animal.class)
                .buildSessionFactory();
    }

    @org.junit.Test

    public void save(){

        Session session = sf.openSession();
        session.beginTransaction();

        // 保存
        Cat cat = new Cat();
        cat.setName("大花猫");
        cat.setCatchMouse("抓老鼠");

        Monkey m = new Monkey();
        m.setName("猴子");
        m.setEatBanana("吃香蕉");

        // 保存
        session.save(cat);
        session.save(m);


        /*
        *
        *

       4条sql
Hibernate:
    insert
    into
        t_animal
        (name)
    values
        (?)
Hibernate:
    insert
    into
        t_cat
        (catchMouse, t_animal_id)
    values
        (?, ?)
Hibernate:
    insert
    into
        t_animal
        (name)
    values
        (?)
Hibernate:
    insert
    into
        t_monkey
        (eatBanana, t_animal_id)
    values
        (?, ?)
        *
        * */

        session.getTransaction().commit();
        session.close();

    }
}

结果

四.继承映射-每个类对应一张表(父类不对应表)

实体类

package com.cx.extend4;

public class Animal {

    private String id;
    private String name;
    
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}

package com.cx.extend4;

public class Cat extends Animal{


    private String catchMouse;

    public String getCatchMouse() {
        return catchMouse;
    }

    public void setCatchMouse(String catchMouse) {
        this.catchMouse = catchMouse;
    }

    
}

package com.cx.extend4;

public class Monkey extends Animal {

    private String eatBanana;

    public String getEatBanana() {
        return eatBanana;
    }

    public void setEatBanana(String eatBanana) {
        this.eatBanana = eatBanana;
    }

}

映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
   继承映射-每个类对应一张表(父类不对应表)
-->

<!--

  abstract="true" 指定实体类对象不对应表
-->

<hibernate-mapping package="com.cx.extend4">
    <class name="Animal" abstract="true">
        <!--如果用union-subclass节点,主键生成策略不能为自增长!-->
        <id name="id">
            <generator class="uuid"></generator>
        </id>

        <property name="name"></property>

        <!--
             union-subclass
             table指定未表名
             表的主键即为id列
        -->

        <union-subclass name="Cat" table="t_cat">
            <property name="catchMouse"></property>
        </union-subclass>

        <union-subclass name="Monkey" table="t_monkey">
            <property name="eatBanana"></property>
        </union-subclass>
    </class>

</hibernate-mapping>

测试

package com.cx.extend4;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Created by cxspace on 16-8-4.
 */
public class Test {

    private static SessionFactory sf;
    static {
        sf = new Configuration()
                .configure()
                .addClass(Animal.class)
                .buildSessionFactory();
    }


    @org.junit.Test
    public void Save() {

        Session session = sf.openSession();
        session.beginTransaction();

        // 保存
        Cat cat = new Cat();
        cat.setName("大花猫");
        cat.setCatchMouse("抓大老鼠");

        Monkey m = new Monkey();
        m.setName("猴子");
        m.setEatBanana("吃香蕉");

        // 保存
        session.save(cat);
        session.save(m);

        session.getTransaction().commit();
        session.close();

    }
    /*
    *
    * Hibernate:
    insert
    into
        t_cat
        (name, catchMouse, id)
    values
        (?, ?, ?)
Hibernate:
    insert
    into
        t_monkey
        (name, eatBanana, id)
    values
        (?, ?, ?)
    *
    *
    *
    * */

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值