【极客营】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<>();
//省略getter和setter方法 } |
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;
//省略getter和setter方法 } |
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. 测试
这种保存要求:必须双方都建立关系,而且都要执行保存操作.