Hibernate框架之路(二)一对多关系

在下列案例中:

  客户是一;联系人是多;客户可以拥有多个联系人;一个联系人只有一个客户

  1、编写实体类

package com.pojo;

import java.util.HashSet;
import java.util.Set;

public class User {
    private Integer uId;    //客户ID(主表)    客户是一
    private String uName;    //名字
    private String uTel;    //手机
//    在客户的表中显示多个联系人
//    使用set集合存储联系人
    private Set<Link> link = new HashSet<Link>();
    public Set<Link> getLink() {
        return link;
    }
    public void setLink(Set<Link> link) {
        this.link = link;
    }
    public Integer getuId() {
        return uId;
    }
    public void setuId(Integer uId) {
        this.uId = uId;
    }
    public String getuName() {
        return uName;
    }
    public void setuName(String uName) {
        this.uName = uName;
    }
    public String getuTel() {
        return uTel;
    }
    public void setuTel(String uTel) {
        this.uTel = uTel;
    }
}

User实体类

package com.pojo;

public class Link {
    private Integer cId;    //联系人ID    联系人是多
    private String cName;    //姓名
    private String cTel;    //电话
    //在联系人的实体类中显示所属客户列表;一个联系人只有一个客户
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public Integer getcId() {
        return cId;
    }
    public void setcId(Integer cId) {
        this.cId = cId;
    }
    public String getcName() {
        return cName;
    }
    public void setcName(String cName) {
        this.cName = cName;
    }
    public String getcTel() {
        return cTel;
    }
    public void setcTel(String cTel) {
        this.cTel = cTel;
    }
}

联系人实体类

  2、配置实体类映射文件

<?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>
    <!-- 客户配置文件 -->
        <class name="com.pojo.User" table="p_user">
            <id name="uId" column="uId">
                <generator class="native"></generator>
            </id>
            <property name="uName" column="uName"></property>
            <property name="uTel" column="uTel"></property>
            <!-- set标签的name属性:指的是写在客户表中的联系人的set集合的名称
                inverse="true":让主表一方放弃维护
            -->
            <set name="link" cascade="save-update,delete" inverse="false">
            <!-- id 的 column 属性的值:数据表的外键名称 -->
                <key column="clid"></key>
                <!-- 客户的所有联系人; class写联系人的实体类路径 -->
                <one-to-many class="com.pojo.Link"/>
            </set>
        </class>
    </hibernate-mapping>
<?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>
    <!-- 联系人配置文件 -->
        <class name="com.pojo.Link" table="p_link">
            <id name="cId" column="cId">
                <generator class="native"></generator>
            </id>
            <property name="cName" column="cName"></property>
            <property name="cTel" column="cTel"></property>
            <!-- 联系人所属客户
                name:客户在联系人实体类的属性
                class:联系人实体类的路径
                column:外键名称
             -->
             <many-to-one name="user" class="com.pojo.Link" column="clid"></many-to-one>
        </class>
    </hibernate-mapping>

  3、配置核心文件

<?xml version="1.0" encoding="UTF-8"?>
<!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>
        <!-- 1、配置数据库信息  必写的 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///person</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- 2、配置hibernate信息   可写   -->
        <!-- 输出SQL底层语句  -->
        <property name="hibernate.show_sql">true</property>
        <!-- 输出SQL底层语句  进行格式化 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 如果没有表。即创建,否则修改表  -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 设置数据库方言  -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <!-- 3、把映射文件放到核心配置文件中 必须的  -->
        <mapping resource="com/pojo/Link.hbm.xml"/>
        <mapping resource="com/pojo/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

  4、加载核心配置文件测试是否搭建成功

package com.unitl;

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

public class HibernateUtils {
    private static Configuration cfg = null;
    private static SessionFactory factory = null;
    static{
        // 加载 hibernate 核心文件
        cfg = new Configuration();
        cfg.configure();
        // 创建 SessionFactory对象
        factory = cfg.buildSessionFactory();
    }
    //获取 hibernate核心文件
    public static SessionFactory getSessionFactory() {
        return factory;
    }
    //绑定本地线程session
    public static Session getSessionObject(){
        return factory.getCurrentSession();
    }
    /**
     * 调用方法
     *     SessionFactory factory = HibernateUtils.getSessionFactory();
     *
     */
    public static void main(String[] args) {
        //执行之后无报错,则配置成功
    }
}

  5、使用方法实现增删改查操作

package com.junit;

import static org.junit.Assert.*;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

import com.pojo.Link;
import com.pojo.User;
import com.unitl.HibernateUtils;

public class Text1 {

    @Test
    public void test() {
        SessionFactory factory = null;
        Session session = null;
        Transaction ts = null;
        try {
            factory = HibernateUtils.getSessionFactory();
            session = factory.openSession();
            ts = session.beginTransaction();
            /**
             * 创建联系人
             */
            Link link1 = new Link();
            link1.setcName("百度");
            link1.setcTel("400-200-666");
            /**
             * 创建客户
             */
            User user1 = new User();
            user1.setuName("张三");
            user1.setuTel("150*******");
            /**
             * 把联系人对象放到客户的set集合里边
             */
            user1.getLink().add(link1);
            /**
             * 把客户放在联系人对象里
             */
            link1.setUser(user1);
            //添加到数据库
            session.save(user1);
            session.save(link1);
            //提交事务
            ts.commit();
        } catch (Exception e) {
            ts.rollback();
        } finally {
            session.close();
            factory.close();
        }
    }
    /**
     * 简化
     * 添加操作
     */
    @Test
    public void test2() {
        SessionFactory factory = null;
        Session session = null;
        Transaction ts = null;
        try {
            factory = HibernateUtils.getSessionFactory();
            session = factory.openSession();
            ts = session.beginTransaction();
            //添加一个客户
            User user1 = new User();
            user1.setuName("李四");
            user1.setuTel("150*******");
            //创建联系人
            Link link1 = new Link();
            link1.setcName("腾讯");
            link1.setcTel("400-200-666");
            //把联系人放到客户的 set 集合里边
            user1.getLink().add(link1);
            // 保存到 数据库里
            session.save(user1);
            ts.commit();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ts.rollback();
        }finally{
            session.close();
            factory.close();
        }
    }
    /**
     * 添加一个联系人到已知的客户里
     * 例子:向一个已知店铺里添加一个商品
     */
    @Test
    public void test3() {
        SessionFactory factory = null;
        Session session = null;
        Transaction ts = null;
        try {
            factory = HibernateUtils.getSessionFactory();
            session = factory.openSession();
            ts = session.beginTransaction();
            //创建一个联系人并添加到已知客户
            Link link1 = new Link();
            link1.setcName("阿里巴巴");
            link1.setcTel("400-200-666");
            //获取客户
            User user = session.get(User.class,2);
            user.getLink().add(link1);
            session.save(user);
            ts.commit();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ts.rollback();
        }finally{
            session.close();
            factory.close();
        }
    }
    /**
     * 删除一个客户
     */
    @Test
    public void test4() {
        SessionFactory factory = null;
        Session session = null;
        Transaction ts = null;
        try {
            factory = HibernateUtils.getSessionFactory();
            session = factory.openSession();
            ts = session.beginTransaction();
            //查询客户ID
            User user = session.get(User.class, 3);
            session.delete(user);
            ts.commit();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ts.rollback();
        }finally{
            session.close();
            factory.close();
        }
    }
    /**
     * 修改操作
     * 把联系人表中的ID为2的联系人改为客户一的联系人
     */
    @Test
    public void test5() {
        SessionFactory factory = null;
        Session session = null;
        Transaction ts = null;
        try {
            factory = HibernateUtils.getSessionFactory();
            session = factory.openSession();
            ts = session.beginTransaction();
            //查询联系人ID和用户ID
            User user = session.get(User.class, 1);
            Link link = session.get(Link.class, 2);
//        把联系人放到客户里边;客户放到联系人里
            user.getLink().add(link);
            link.setUser(user);
            ts.commit();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ts.rollback();
        }finally{
            session.close();
            factory.close();
        }
    }
}

时间: 2024-11-06 10:43:02

Hibernate框架之路(二)一对多关系的相关文章

使用annotation配置hibernate(2):一对多关系配置

数据表结构 单向一对多 Student.java 1 @Entity 2 @Table(name = "student") 3 public class Student { 4 @Id 5 @Column(name = "id") 6 @GenericGenerator(name = "generator",strategy = "native") 7 @GeneratedValue(generator = "gen

[原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

hibernate学习(5)——一对多关系表达

一对多实现 1. 实现类 package com.alice.hibernate02.vo; import java.util.HashSet; import java.util.Set; public class Customer { private Integer id; private String name; // 一对多:一个客户(当前客户) 拥有 [多个订单] // * 需要容器存放多个值,一般建议Set (不重复.无序) // * 参考集合:List.Map.Array等 // *

Hibernate框架之路(二)多对多多关系

1.配置实体类 package cn.pojo; import java.util.HashSet; import java.util.Set; public class User { /** * 用户表 */ private Integer user_id; private String user_name; private String user_pwd; private Set<Role> setRole = new HashSet<Role>(); public Integ

hibernate框架的学习(二)

hibernate的核心配置和API 一:核心配置分为三大部分  必须的配置 .可选的配置和引入映射文件. 1.必须的配置 连接数据库的参数:驱动类  url路径  用户名  密码  方言 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url"

Hibernate框架之路(四)hibernate查询方式

OID查询 /** * OID 查询 * 根据ID查询 * 一对多查询 */ @Test public void test() { SessionFactory factory = null; Session session = null; Transaction ts = null; try { factory = HibernateUtils.getSessionFactory(); session = factory.openSession(); ts = session.beginTra

Hibernate框架单向多对一关联映射关系

建立多对一的单向关联关系    Emp.java            private Integer empNo //员工编号            private String empName //员工姓名            //private Integer deptNo;  //部门编号            private Dept dept;    //所属部门    Dept.java            private Byte deptNo;              

Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理

Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理 本博文主要介绍 Laravel 框架中 Eloquent  对一对多关系的处理,在 Laravel Administrator(后台扩展包) 您的数据库可能是彼此相关的.比如,一篇博客文章可能有许多评论,或者一个订单与下订单的用户相关.Eloquent 使得管理和处理这些关系变得简单.Laravel 提供了四种类型的关系: -一对一 -一对多 - 多对多 - 多态关系 一对多 一个一对多关系的例子是一篇博客文章有许多评

Hibernate框架简介

面试被问及了Hibernate框架,虽然问的很少,很简单,但是还是简单的总结一下吧,以备以后不时之需. 什么是Hibernate框架? 百科定义:Hibernate框架式一个开源的对象关系映射(ORM)框架,是对JDBC的轻量级的对象封装,使java程序员可以使用对象思维来操纵DB. 白话版:在Hibernate之前,我们是如何操作DB的?JDBC,需要在程序中嵌入SQL语句.效率低下,不能忍啊.但是Hibernate的出现,让我们无需再操纵SQL语句了,每个表实例被实例化为一个java对象,操