hibernate多对一查询

1.实体类
package com.lanou3g.bean;
/*
 * CREATE TABLE `cst_linkman` (
  `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
  `lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
  `lkm_cust_id` bigint(32) NOT NULL COMMENT '客户id',
  `lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',
  `lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
  `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
  `lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
  `lkm_qq` varchar(16) DEFAULT NULL COMMENT '联系人qq',
  `lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
  `lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
  PRIMARY KEY (`lkm_id`),
  KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),
  CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
)
 */

public class LinkMan {
    private Long lkm_id;
    private String lkm_name;
    private Long lkm_cust_id;
    private Character lkm_gender;
    private String lkm_phone;
    private String lkm_mobile;
    private String lkm_email;
    private String lkm_qq;
    private String lkm_position;
    private String lkm_memo;
    // 多表表示跟一表的关系
    private Customer customer;

    public Customer getCustomer() {
        return customer;
    }
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
    public LinkMan() {
        super();
        // TODO Auto-generated constructor stub
    }
    public LinkMan(Long lkm_id, String lkm_name, Long lkm_cust_id, Character lkm_gender, String lkm_phone,
            String lkm_mobile, String lkm_email, String lkm_qq, String lkm_position, String lkm_memo) {
        super();
        this.lkm_id = lkm_id;
        this.lkm_name = lkm_name;
        this.lkm_cust_id = lkm_cust_id;
        this.lkm_gender = lkm_gender;
        this.lkm_phone = lkm_phone;
        this.lkm_mobile = lkm_mobile;
        this.lkm_email = lkm_email;
        this.lkm_qq = lkm_qq;
        this.lkm_position = lkm_position;
        this.lkm_memo = lkm_memo;
    }
    public Long getLkm_id() {
        return lkm_id;
    }
    public void setLkm_id(Long lkm_id) {
        this.lkm_id = lkm_id;
    }
    public String getLkm_name() {
        return lkm_name;
    }
    public void setLkm_name(String lkm_name) {
        this.lkm_name = lkm_name;
    }
    public Long getLkm_cust_id() {
        return lkm_cust_id;
    }
    public void setLkm_cust_id(Long lkm_cust_id) {
        this.lkm_cust_id = lkm_cust_id;
    }
    public Character getLkm_gender() {
        return lkm_gender;
    }
    public void setLkm_gender(Character lkm_gender) {
        this.lkm_gender = lkm_gender;
    }
    public String getLkm_phone() {
        return lkm_phone;
    }
    public void setLkm_phone(String lkm_phone) {
        this.lkm_phone = lkm_phone;
    }
    public String getLkm_mobile() {
        return lkm_mobile;
    }
    public void setLkm_mobile(String lkm_mobile) {
        this.lkm_mobile = lkm_mobile;
    }
    public String getLkm_email() {
        return lkm_email;
    }
    public void setLkm_email(String lkm_email) {
        this.lkm_email = lkm_email;
    }
    public String getLkm_qq() {
        return lkm_qq;
    }
    public void setLkm_qq(String lkm_qq) {
        this.lkm_qq = lkm_qq;
    }
    public String getLkm_position() {
        return lkm_position;
    }
    public void setLkm_position(String lkm_position) {
        this.lkm_position = lkm_position;
    }
    public String getLkm_memo() {
        return lkm_memo;
    }
    public void setLkm_memo(String lkm_memo) {
        this.lkm_memo = lkm_memo;
    }
    @Override
    public String toString() {
        return "LinkMan [lkm_id=" + lkm_id + ", lkm_name=" + lkm_name + ", lkm_cust_id=" + lkm_cust_id + ", lkm_gender="
                + lkm_gender + ", lkm_phone=" + lkm_phone + ", lkm_mobile=" + lkm_mobile + ", lkm_email=" + lkm_email
                + ", lkm_qq=" + lkm_qq + ", lkm_position=" + lkm_position + ", lkm_memo=" + lkm_memo + "]";
    }
}
package com.lanou3g.bean;

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

/*
CREATE TABLE `cst_customer` (
`cust_id` BIGINT (32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` VARCHAR (32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_source` VARCHAR (32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` VARCHAR (32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` VARCHAR (32) DEFAULT NULL COMMENT '客户级别',
`cust_linkman` VARCHAR (64) DEFAULT NULL COMMENT '联系人',
`cust_phone` VARCHAR (64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` VARCHAR (16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
*/
public class Customer {
    private Long cust_id;
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_linkman;
    private String cust_phone;
    private String cust_mobile;
    // 表示一对多关系的容器
    // 注意:容器你必须初始化了 才能保存东西
    private Set<LinkMan> linkMans = new HashSet<>();
    public Set<LinkMan> getLinkMans() {
        return linkMans;
    }
    public void setLinkMans(Set<LinkMan> linkMans) {
        this.linkMans = linkMans;
    }
    public Customer() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Customer(Long cust_id, String cust_name, String cust_source, String cust_industry, String cust_level,
            String cust_linkman, String cust_phone, String cust_mobile) {
        super();
        this.cust_id = cust_id;
        this.cust_name = cust_name;
        this.cust_source = cust_source;
        this.cust_industry = cust_industry;
        this.cust_level = cust_level;
        this.cust_linkman = cust_linkman;
        this.cust_phone = cust_phone;
        this.cust_mobile = cust_mobile;
    }
    public Long getCust_id() {
        return cust_id;
    }
    public void setCust_id(Long cust_id) {
        this.cust_id = cust_id;
    }
    public String getCust_name() {
        return cust_name;
    }
    public void setCust_name(String cust_name) {
        this.cust_name = cust_name;
    }
    public String getCust_source() {
        return cust_source;
    }
    public void setCust_source(String cust_source) {
        this.cust_source = cust_source;
    }
    public String getCust_industry() {
        return cust_industry;
    }
    public void setCust_industry(String cust_industry) {
        this.cust_industry = cust_industry;
    }
    public String getCust_level() {
        return cust_level;
    }
    public void setCust_level(String cust_level) {
        this.cust_level = cust_level;
    }
    public String getCust_linkman() {
        return cust_linkman;
    }
    public void setCust_linkman(String cust_linkman) {
        this.cust_linkman = cust_linkman;
    }
    public String getCust_phone() {
        return cust_phone;
    }
    public void setCust_phone(String cust_phone) {
        this.cust_phone = cust_phone;
    }
    public String getCust_mobile() {
        return cust_mobile;
    }
    public void setCust_mobile(String cust_mobile) {
        this.cust_mobile = cust_mobile;
    }
    @Override
    public String toString() {
        return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_source=" + cust_source
                + ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_linkman=" + cust_linkman
                + ", cust_phone=" + cust_phone + ", cust_mobile=" + cust_mobile + "]";
    }
}

2. Customter.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.lanou3g.bean">
    <class name="LinkMan" table="cst_linkman">
        <id name="lkm_id" column="lkm_id">
            <generator class="native"></generator>
        </id>
        <property name="lkm_name" column="lkm_name"></property>
        <property name="lkm_gender" column="lkm_gender"></property>
        <property name="lkm_phone" column="lkm_phone"></property>
        <property name="lkm_mobile" column="lkm_mobile"></property>
        <property name="lkm_email" column="lkm_email"></property>
        <property name="lkm_qq" column="lkm_qq"></property>
        <property name="lkm_position" column="lkm_position"></property>
        <property name="lkm_memo" column="lkm_memo"></property>

        <!-- 配置表关系 -->
        <!-- 
            name : 表示关系的对象的属性名
            column : 表中外键名
            class : 多对一关系中 对应的实体类名
            注意:外键的属性值只能配一次
         -->
        <many-to-one name="customer" column="lkm_cust_id" class="Customer"></many-to-one>
    </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 package="com.lanou3g.bean">
    <class name="Customer" table="cst_customer">
        <id name="cust_id" column="cust_id">
            <generator class="native"></generator>
        </id>
        <property name="cust_name" column="cust_name"></property>
        <property name="cust_source" column="cust_source"></property>
        <property name="cust_industry" column="cust_industry"></property>
        <property name="cust_level" column="cust_level"></property>
        <property name="cust_linkman" column="cust_linkman"></property>
        <property name="cust_phone" column="cust_phone"></property>
        <property name="cust_mobile" column="cust_mobile"></property>
        <!-- 配置表示关系的容器 -->
        <!-- 
            name: 实体类中容器的属性名
            column: 表中的外键名
            class: 表示一对多中 多表的类(全类名)
            inverse 控制是否维护外键
            inverse 默认值维护外键的关系 默认值是false
            结语:inverse可以减少hibernate无用的操作

            cascade:级连操作
            save-update
            delete
            all == save-update + delete

            建议:如果要用级联操作就用sava-update慎用delete
         -->
        <set name="linkMans" cascade="save-update">
            <key column="lkm_cust_id"></key>
            <one-to-many class="LinkMan" />
        </set>
    </class>
</hibernate-mapping>
3.hibernater测试多对一
package com.lanou3g.bean;

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

public class Demo01 {
    /*
     * 添加一个客户 两个联系人
     */
    @Test
    public void fun1() {
        // 获取session 
        Session session = HibernateUtils.getSession();
        // 开启事务
        Transaction transaction = session.beginTransaction();
        // 创建客户
        Customer customer = new Customer();
        customer.setCust_name("蓝欧科技");
        // 创建联系人
        LinkMan l1 = new LinkMan();
        l1.setLkm_name("杨虎");
        LinkMan l2 = new LinkMan();
        l2.setLkm_name("刘凯");
        // 添加实体类中的关系
        // 把联系人添加到集合中
        customer.getLinkMans().add(l1);
        customer.getLinkMans().add(l2);
        // 给联系人设置客户
        l1.setCustomer(customer);
        l2.setCustomer(customer);
        // 保存到数据库
        session.save(customer);
        session.save(l1);
        session.save(l2);
        // 提交事务
        transaction.commit();
        // 关闭资源
        session.close();
    }
    // 为客户id为1的人删除联系人id为2
    @Test
    public void fun2() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        // 获取id为1的客户
        // 持久态 在事务提交的时候 如果该对象被修改了
        // 那么修改的数据会被同步到数据中
        Customer customer = session.get(Customer.class, 1l);
        // 获取id为2的联系人
        LinkMan linkMan = session.get(LinkMan.class, 2l);
        // 处理实体类中的关系
        customer.getLinkMans().remove(linkMan);
        linkMan.setCustomer(null);
        // 从数据库中删除
        session.delete(linkMan);

        //session.update(customer);
        transaction.commit();
        session.close();
    }

    // 为客户id为1 增加联系人
    /*
     * 打印的插入语句是linkman 在维护自己的表
     * 并且在插入的时候 已经插入了外键(外键已经有了)
     * 
     * 对hibernate执行的SQL语句的优化
     * 打印的更新语句 是Customer来维护从而打印出来的
     * 这里对外键的维护 俩个表都维护一遍 造成了多余的SQL语句操作
     */
    @Test
    public void fun3() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        Customer customer = session.get(Customer.class, 1l);
        //创建新的联系人
        LinkMan l3 = new LinkMan();
        l3.setLkm_name("龙哥");
        //处理实体类中的关系
        l3.setCustomer(customer);
        customer.getLinkMans().add(l3);
        //保存到数据库
        session.save(l3);
        session.update(customer);
        transaction.commit();
        session.close();
    }
    //新增客户 和 联系人(李胜运)
    //级连操作:可以使你减少几行代码的工作量
    @Test
    public void fun4() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();
        Customer customer = new Customer();
        customer.setCust_name("丰收科技");
         LinkMan linkMan = new LinkMan();
         linkMan.setLkm_name("你随意");
         //设置实体类
         customer.getLinkMans().add(linkMan);
         linkMan.setCustomer(customer);
        //保存到数据库
        session.save(customer);
        session.save(linkMan);


        transaction.commit();
        session.close();
    }
    //级连 删除id为1客户同时删除联系人
    @Test
    public void fun5() {
        Session session = HibernateUtils.getSession();
        Transaction transaction = session.beginTransaction();

          Customer customer = session.get(Customer.class, 1L);
          session.delete(customer);

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值