【极客营】Hibernate完成CRM的联系人的保存操作-需求分析

作者:何征天

课程视频地址:https://ke.qq.com/course/273907

1.1.   需求分析

1. 因为客户和联系人是一对多的关系,在有客户的情况下,完成联系人的添加保存操作

1.2.  技术分析之Hibernate的关联关系映射之一对多映射(重点)

1.2.1. JavaWEB中一对多的设计及其建表原则
1.2.2.  先导入SQL的建表语句

        * 创建今天的数据库:createdatabase hibernate_day03;
        * 在资料中找到客户和联系人的SQL脚本

1.2.3.  编写客户和联系人的JavaBean程序(注意一对多的编写规则)

      * 客户的JavaBean如下

packagecom.igeek.demo1;

 

import java.util.HashSet;

import java.util.Set;

 

publicclass Customer {

     private Long cust_id    ;      //客户编号(主键)

     private String  cust_name;     //    客户名称(公司名称)

     private String cust_user_id;   //   负责人id

     private String cust_create_id ;//  创建人id

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

     

    //省略gettersetter方法

}

 * 联系人的JavaBean如下

packagecom.igeek.demo1;//

 

publicclass Linkman {

    private Long lkm_id;//联系人编号(主键)

    private String  lkm_name ;// 联系人姓名

    //hibernate使用对象来做关联,不用设置外键id

    //private String  lkm_cust_id ;// 客户id

    private String  lkm_gender ;// 联系人性别

    private String  lkm_phone ;// 联系人办公电话

    private String  lkm_mobile ;// 联系人手机

    private String  lkm_email ;// 联系人邮箱

    private String  lkm_qq;// 联系人qq

    private String  lkm_position;// 联系人职位

    private String  lkm_memo ;// 联系人备注

    //与一方关联的属性

    private Customer customer;

   

    //省略gettersetter方法

}

1.2.4.  编写客户和联系人的映射配置文件(注意一对多的配置编写)

* 客户的映射配置文件如下

<?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.igeek.demo1.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_user_id" column="cust_user_id"></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:javabean中set集合的名称

           key:column:外键名称

           one-to-many class:set集合中类的全路径  

        -->

       <set name="linkmans">

           <key column="lkm_cust_id"></key>

           <one-to-many class="com.igeek.demo1.Linkman"/>

       </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.igeek.demo1.Linkman" table="cst_linkman">

       <id name="lkm_id" column="lkm_id">

           <generator class="native"></generator>

       </id>

       <property name="lkm_name" column="lkm_name"></property>

       <!--

       外键字段使用many-to-one节点设置,这里不用写

       <property name="lkm_cust_id" column="lkm_cust_id"></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:javabean的属性名称

       class:属性的类的全路径

       colum:外键名称 -->

       <many-to-one   name="customer" class="com.igeek.demo1.Customer" column="lkm_cust_id"></many-to-one>

    </class>

</hibernate-mapping>

1.2.5.  配置文件和具体的说明

  * 一方
            <!--JavaBean对象中有Set集合,必须要配置Set集合,配置了
                    Set        name属性:Set集合的名称
                    key        column:外键的名称
                    one-to-many  class:Set集合中类的全路径
            -->
            <setname="linkmans">
                <keycolumn="lkm_cust_id"/>
                <one-to-manyclass="com.igeek.demo1.Linkman"/>
            </set>
        
        * 多方
            <!--配置的是多方 ,使用的是many-to-one标签
                name        JavaBean的属性的名称
                class        属性的类的全路径
                column        外键的名称
            -->
    <many-to-one name="customer" class="com.igeek.demo1.Customer"column="lkm_cust_id"/> 

1.2.6.  hibernate.cfg.xml文件配置信息

<?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>

       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

       <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day03</property>

       <property name="hibernate.connection.username">root</property>

       <property name="hibernate.connection.password">123456</property>

       <property name="hibernate.dialect org.hibernate.dialect.MySQLDialect"></property>

       <!-- 打印sql语句的配置 -->

       <property name="hibernate.show_sql">true</property>

       <property name="hibernate.format_sql">true</property>

       <property name="hibernate.hbm2ddl.auto">update</property>

      

       <!-- 把session放在线程中 -->

       <property name="hibernate.current_session_context_class">thread</property>

      

       <!-- 关联xml配置文件 -->

       <mapping resource="com/igeek/demo1/Customer.hbm.xml"/>

       <mapping resource="com/igeek/demo1/Linkman.hbm.xml"/>

      

      

    </session-factory>

</hibernate-configuration>

1.2.7.  进行双向关联进行数据的保存 

packagecom.igeek.demo1;

 

import org.hibernate.Session;

import org.hibernate.Transaction;

import org.junit.Test;

 

importcom.igeek.util.HibernateUtils;

 

publicclass TestOne2Many {

    //双向关联

    @Test

    publicvoid run1(){

       Session session = HibernateUtils.getCurrentSession();

       Transaction tr = session.beginTransaction();

      

       //新建一个客户

       Customer c = new Customer();

       c.setCust_name("小凤");

      

       //新建2个联系人

       Linkman m1 = new Linkman();

       m1.setLkm_name("小凤的男朋友1");

      

       Linkman m2 = new Linkman();

       m2.setLkm_name("小凤的男朋友2");

      

       //双向关联

       c.getLinkmans().add(m1);

       c.getLinkmans().add(m2);

      

       m1.setCustomer(c);

       m2.setCustomer(c);

      

       //开始保存

       session.save(c);

       session.save(m1);

       session.save(m2);

      

       tr.commit();

    }

}

1.2.8.  测试

这种保存要求:必须双方都建立关系,而且都要执行保存操作.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值