Hibernate(五)多表联查之单向多对一

Hibernate多表查询分为单向和双向:
单向的意思是:只能从A表查询B表的数据,而不能从B表反过来查A表的数据。
双向的意思则是:既能从A表查询到B表,反过来能可以从B表查到A表的数据。

好,接下来我们开始写多表查询:

单向之多对一

1、先创建工具类:HibernateUtil:

public class HibernateUtilEX {
    private static Configuration configuration = null;
    private static SessionFactory sessionFactory = null;
    // 本地化线程、
    private static ThreadLocal<Session> localSession = null;

    static {
        try {
            // 加载Hibernate配置文件(默认加载bihernate.cfg.xml)
            configuration = new Configuration().configure();
            // 获取SessionFactory工厂对象
            sessionFactory = configuration.buildSessionFactory();

            localSession = new ThreadLocal<Session>();
        } catch (Exception e) {
            System.out.println("加载hibernate映射文件失败");
            e.printStackTrace();
        }
    }

    /**
     * 得到Session对象
     * 
     * @return Session
     */
    public static Session openSession() throws HibernateException {
        // 底层有一个Map<k,V>,K:线程ID,V:session ,一个线程绑定一个session
        Session session = localSession.get();
        if (session == null) {
            session = sessionFactory.openSession();
            localSession.set(session);
        }
        return session;
    }

    /**
     * 关闭Session
     * 
     * @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = localSession.get();
        if (session != null) {
            session.close();
        }
        localSession.set(null);
    }
}

这里举例;乘客乘公交
2、先建两个实体类:公交实体类:BusEntity

public class BusEntity {
    private int id;
    private String route; // 路线

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getRoute() {
        return route;
    }
    public void setRoute(String route) {
        this.route = route;
    }
    @Override
    public String toString() {
        return "BusEntity [id=" + id + ", route=" + route + "]";
    }
}

配置文件:BusEntity.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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.zh.entity">
    <class name="BusEntity" table="t_bus">
        <!-- 映射标识属性(属性) -->
        <id name="id" column="id" type="int">
            <!-- 主键生成策略(自增主键) -->
            <generator class="native" />
        </id>

        <!-- 映射普通属性 -->
        <property name="route" column="route"></property>
    </class>
</hibernate-mapping>

乘客实体类:PassengerEntity

public class PassengerEntity {
    private int id;
    private String name;// 乘客姓名
    private String destination;// 目的地
    private BusEntity bus; // 乘坐Bus

    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 String getDestination() {
        return destination;
    }
    public void setDestination(String destination) {
        this.destination = destination;
    }
    public BusEntity getBus() {
        return bus;
    }
    public void setBus(BusEntity bus) {
        this.bus = bus;
    }
    @Override
    public String toString() {
        return "Passenger [id=" + id + ", name=" + name + ", destination=" + destination + ", bus=" + bus + "]";
    }
}

配置文件:BusEntity.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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.zh.entity">
    <class name="PassengerEntity" table="t_passenger">
        <!-- 映射标识属性(属性) -->
        <id name="id" column="id" type="int">
            <!-- 主键生成策略(自增主键) -->
            <generator class="native" />
        </id>

        <!-- 映射普通属性 -->
        <property name="name" column="name"></property>
        <property name="destination" column="destination"></property>

        <!-- 单向多对一关联映射 (cascade表示级联操作,all表示ZSGC都采用,none表示不级联) -->
        <many-to-one name="bus" class="BusEntity" column="bus_id" cascade="all"></many-to-one>
    </class>
</hibernate-mapping>

3、在总配置文件hibernate.cfg.xml里添加配置映射文件
这里写图片描述
4、创建测试类:HibernateTest

public class HibernateTest {
    // 单向多对一测试
    public void SingleManyToOneTest() {
        // 创建session会话
        Session session = HibernatUtil.getSession();
        // 打开事物
        Transaction transaction = session.beginTransaction();
        /**
         *  创建乘客实体类1
         */
        PassengerEntity passenger = new PassengerEntity();
        passenger.setName("张三");
        passenger.setDestination("春熙路公交站");
        /**
         *  创建乘客实体类2
         */
        PassengerEntity passenger2 = new PassengerEntity();
        passenger2.setName("李四");
        passenger2.setDestination("红星路公交站");
        /**
         *  创建公交实体类
         */
        BusEntity bus = new BusEntity();
        bus.setRoute("102路");
        //实体类获取Bus属性
        // 因为我们在配置中使用了级联属性,所以这里passenger只需要设置一次属性,数据库则会关联两个乘客
        passenger.setBus(bus);
        //保存到数据库
        session.persist(passenger);
        session.persist(passenger2);

        //事物提交
        transaction.commit();
        //关闭会话
        HibernatUtil.closeSession(session);
    }
}

添加成功!
这里写图片描述
对应数据数:
这里写图片描述
这里写图片描述
联表查询,体现的是类与类之间的关系,所以关键之处在于理解实体类之间谁是多的一方,谁是单独的一方!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值