【极客营】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方法 } |
* 联系人的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; //省略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. 测试
这种保存要求:必须双方都建立关系,而且都要执行保存操作.
【极客营】Hibernate完成CRM的联系人的保存操作-需求分析相关推荐
- “StarRocks 极客营” 重磅来袭,和技术大牛一起推开数据库梦想之门!
操作系统.编译器.数据库是软件工程师的梦之所向,对于大多数人而言,却是近在眼前.远在天边: 你是否曾渴望加入 Linux 这样伟大的社区,然觉门槛太高无从下手? 你是否也曾想象参与开发 MySQL 这 ...
- All Eyes on Docs! 练就火眼金睛,就来StarRocks 极客营
开放源代码运动的主要领导者--埃里克·雷蒙(Eric Steven Raymond)在他出版的<大教堂与集市>中描述了这样一个精彩的观点:只要有足够多的眼球关注,就可让所有软件缺陷浮现.他 ...
- StarRocks极客营 | 90天,17名新晋贡献者,SQL Planner 实战回顾
若能体验一个字符串的 SQL 怎么一步步在 StarRocks 被执行起来,对于 OLAP 开发者来说,能大大帮助理解整个框架和系统流程. 近日,由 StarRocks 社区举办的 SQL Plann ...
- 首篇极客解题报告意外泄出!亚军竟有神操作?
导语 | 腾讯云+社区联合腾讯码客.腾讯安全平台部全新打造的创新赛事[腾讯极客挑战赛 | 鹅罗斯方块]正式落幕.玩鹅罗斯方块,玩点不一样!在短暂10天内,4570名参赛者或以自己的硬核技术诠释着 &q ...
- 【最强大脑】全球脑王的极客挑战赛之路:1413876分夺冠如何炼成?
导语 | 在腾讯云+社区联合腾讯码客.腾讯安全平台部全新打造的创新赛事[腾讯极客挑战赛 | 鹅罗斯方块]中,4570名参赛者为我们带来前所未有.异彩纷呈的作品.一场技术竞技,把一群志同道合的开发者聚集 ...
- 脉脉因“App 整改下架”事件致歉;阿里云全年营收超 600 亿;腾讯防大量群消息骚扰专利获授权|极客头条...
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...
- 小米否认“造车”;微软中国回应关闭实体直营店;Angular 10 发布 | 极客头条...
整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极 ...
- 任正非回应“华为营收下降300亿美元”;今日头条澄清「通讯录不属于用户隐私」;Kotlin 1.3.40发布 | 极客头条...
快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...
- 【AI创造营】是极客就坚持一百秒?
因为项目需要用到摄像头和显示效果,所以无法在aistudio上直接运行,Fork项目后可见可运行文件,下面直接上效果 [AI创造营]是极客就坚持100秒 参赛作品名 是男人就坚持100秒(DodgeF ...
- 极客日报第124期:脉脉因“App 整改下架”事件致歉;阿里云全年营收超 600 亿;腾讯防大量群消息骚扰专利获授权
一分钟速览新闻点! 腾讯防大量群消息骚扰专利获授权 脉脉因"App 整改下架"事件致歉:将进行排查整改 快手灰度测试同城团购功能,入局本地生活服务赛道 字节跳动在重庆成立今日头条公 ...
最新文章
- 2020人工神经网络第一次作业-参考答案第二部分
- [4.9福建四校联考]
- java开发流程图_Java 详解 JVM 工作原理和流程
- 排列出所有子串暴力递归
- 浏览器对F5的微观处理
- 微软将在英国投入20亿Bing广告 挑战Google的统治地位
- Flutter之基本数据类型测试
- 2009年广东省大学生程序设计竞赛 A
- [HttpPost] vs [AcceptVerbs(HttpVerbs.Post)]
- 英特尔处理器曝出重大安全漏洞,迫使 Linux 和 Windows 更新设计
- 【数学】【筛素数】Miller-Rabin素性测试 学习笔记
- 网银--U盾等--支付宝等总结
- 常忘知识点二-混合器
- malloc与calloc的区别及实例
- git版本回退命令_刘先生
- 电路邱关源学习笔记——1.5电压源和电流源
- 动态、静态和伪静态url路径如何分辨
- 无internet,安全
- ORA-38029 ORA-20005
- 石家庄医学高等专科学校计算机试题,石家庄医学高等专科学校高职单招医学类对口职业测试题...