(1)什么样的关系是属于一对一
一个公司只能有一个注册地址,一个注册地址只能被一个公司注册。
(2)一对一键表原则
1、创建项目引入架包
2、创建数据库和表
创建一对多数据库关系的表
(1)创建客户表
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_phone
varchar(64) DEFAULT NULL COMMENT ‘固定电话’,
cust_mobile
varchar(16) DEFAULT NULL COMMENT ‘移动电话’,
PRIMARY KEY (cust_id
)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
(2)创建联系人的表
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) DEFAULT 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
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
(3)创建实体
一的一方的实体,当中放置多的一方的集合
代码如下:
多的一方的实体,放置一的一方的对象
代码如下:
同时分别生成set和get方法
(4)创建映射文件
在项目文件夹下创建映射文件
多的一方的映射文件
LinkMan.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><class name=“com.itzheng.hibernate.domain.LinkMan”
table=“cst_linkman”>
一的一方的映射文件
Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><class name=“com.itzheng.hibernate.domain.Customer”
table=“cst_customer”>
4、配置核心配置文件Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>com.mysql.jdbc.Driver
jdbc:mysql:///hibernate_day03
root
root
org.hibernate.dialect.MySQLDialect
true
true
update
org.hibernate.connection.C3P0ConnectionProvider
5
20
120
3000
4
thread
<mapping
resource=“com/itzheng/hibernate/domain/Customer.hbm.xml” />
<mapping
resource=“com/itzheng/hibernate/domain/LinkMan.hbm.xml” />
5、log4j.properties
direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
direct messages to file mylog.log
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
set log levels - for more verbose logging change ‘info’ to ‘debug’
error warn info debug trace
log4j.rootLogger= info, stdout
6、配置工具类
package com.itzheng.hibernate.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*
Hibernate的工具类
做hibernate的小练习,对configuration的configure()方法很好奇,为啥创建的对象还要执行这个方法呢。
Configuration cfg = new Configuration().configure();
原来configure()方法默认会在classpath下面寻找hibernate.cfg.xml文件,
如果没有找到该文件,系统会打印如下信息并抛出HibernateException异常。
其实不使用configure()方法也可以
Configuration cfg = new Configuration();
这时hibernate会在classpath下面寻找hibernate.properties文件,
如果没有找到该文件,系统会打印如下信息并抛出HibernateException异常。
*/
public class HibernateUtils {
public static final Configuration cfg;
public static final SessionFactory sf;
static {
cfg = new Configuration().configure();// 获取与数据库的链接的配置文件
sf = cfg.buildSessionFactory();//开启事务建立与数据库之间的链接
}
public static Session openSession() {
return sf.openSession();
}
public static Session getCurrentSession() {
return sf.getCurrentSession();
}
}
1、编写测试类(一对多的基本配置和操作)
package com.itzheng.hibernate.demo1;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itzheng.hibernate.domain.Customer;
import com.itzheng.hibernate.domain.LinkMan;
import com.itzheng.hibernate.utils.HibernateUtils;
/*
- 一对多的测试类
*/
public class HibernateDemo1 {
@Test
// 保存两个客户和三个联系人 并且建立好关系
public void demo01() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 创建两个客户
Customer customer1 = new Customer();
customer1.setCust_name(“王东”);
Customer customer2 = new Customer();
customer2.setCust_name(“赵洪”);
// 创建3个联系人
LinkMan linkMan1 = new LinkMan();
linkMan1.setLkm_name(“分解”);
LinkMan linkMan2 = new LinkMan();
linkMan2.setLkm_name(“如花”);
LinkMan linkMan3 = new LinkMan();
linkMan3.setLkm_name(“旺财”);
// 设置关系
linkMan1.setCustomer(customer1);// 将客户放入到联系人当中
linkMan2.setCustomer(customer1);
linkMan3.setCustomer(customer2);
customer1.getLinkMans().add(linkMan1);// 将联系人放入到客户的集合当中
customer1.getLinkMans().add(linkMan2);
customer2.getLinkMans().add(linkMan3);
// 保存数据
session.save(linkMan1);
session.save(linkMan2);
session.save(linkMan3);
session.save(customer1);
session.save(customer2);
transaction.commit();
}
}
2、Hibernate的一对多相关的操作
(1)一对多的关系只保存一遍是否可以:
更改核心配置文件
测试代码
@Test
// 一对多关系只保存一边 是否可以
public void demo2() {
Session session = HibernateUtils.getCurrentSession();
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);//只保存客户
transaction.commit();
}
当只保存客户时:报错:瞬时对象异常:持久态对象关联了瞬时太的对象
customer —>save之后变成持久的了 但是LinkMan 还是瞬时的
当只保存联系人的时候:报错
解决办法通过级联的方式,保证只操控一个对象的时候就可以,同时操作其关联的对象
(2)一对多的级联操作:
什么吗叫做级联
级联指的是,我们在操作一个对象的时候,会同时操作其关联的对象。
级联是有方向性的
a、操作一的一方的时候,会操作到多的一方。
b、操作多的一方的时候,会操作到一的一方。
3、级联保存或者更新
(1)保存客户级联联系人(一的一方配置级联)
级联保存或更新的操作
保存客户级联联系人
操作的主体对象是客户对象,需要在客户的映射文件Customer.hbm.xml中 进行配置
cascade配置级联
@Test
// 级联保存或更新的操作
//保存客户级联联系人
//操作的主体对象是客户对象,需要在客户的映射文件Customer.hbm.xml中 进行配置
public void demo3() {
Session session = HibernateUtils.getCurrentSession();
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);//只保存客户
transaction.commit();
}
(2)保存联系人级联客户(多的一方配置级联)
级联保存或更新的操作
保存联系人级联客户
操作的主体对象是客户对象,需要在客户的映射文件LinkMan.hbm.xml中 进行配置
@Test
// 级联保存或更新的操作
// 保存联系人级联客户
// 操作的主体对象是客户对象,需要在客户的映射文件LinkMan.hbm.xml中 进行配置
public void demo4() {
Session session = HibernateUtils.getCurrentSession();
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(linkMan);// 只保联系人
transaction.commit();
}
(3)测试对象的导航
测试对象的导航
前提:一对多的双方都设置了cascade=“save-update”
@Test
// 测试对象的导航
// 前提:一对多的双方都设置了cascade=“save-update”
public void demo5() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name(“铁蛋”);
LinkMan linkMan1 = new LinkMan();
linkMan1.setLkm_name(“小花”);
LinkMan linkMan2 = new LinkMan();
linkMan2.setLkm_name(“大花”);
LinkMan linkMan3 = new LinkMan();
linkMan3.setLkm_name(“二花”);
linkMan1.setCustomer(customer);// 1号连续人关联客户
customer.getLinkMans().add(linkMan2);// 客户关联二号联系人
customer.getLinkMans().add(linkMan3);// 客户关联三号联系人
// 双方都设置了cascade
session.save(linkMan1);// 发送4条insert语句,当保存一号联系人的时候,同时会将客户,二号联系人和三号联系都保存进去
transaction.commit();
}
发送4条insert语句,当保存一号联系人的时候,同时会将客户,二号联系人和三号联系都保存进去
如果存储的是customer对象
发送3条insert语句 存储 客户 联系人2 联系人3
如果存储的是linkMan2对象
发送一条insert语句
4、级联删除
1、级联删除:
删除一边的时候,同时会删除另一方的数据也一并删除。
2、删除客户级联删除联系人
(1)先往数据库当中保存数据
@Test
// 保存两个客户和三个联系人 并且建立好关系
public void demo01() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 创建两个客户
Customer customer1 = new Customer();
customer1.setCust_name(“王东”);
Customer customer2 = new Customer();
customer2.setCust_name(“赵洪”);
// 创建3个联系人
LinkMan linkMan1 = new LinkMan();
linkMan1.setLkm_name(“分解”);
LinkMan linkMan2 = new LinkMan();
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/37bacffe394477879bc4d7340b7fdad2.jpeg)
最后的内容
在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)
如何准备面试?
1、前期铺垫(技术沉积)
程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。
下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问
这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!
- Java程序员必看《Java开发核心笔记(华山版)》
- Redis学习笔记
- Java并发编程学习笔记
四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇
- Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)
- 大厂面试必问——数据结构与算法汇集笔记
其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。
2、狂刷面试题
技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。
①大厂高频45道笔试题(智商题)
②BAT大厂面试总结(部分内容截图)
③面试总结
3、结合实际,修改简历
程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:
以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
)]
其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。
[外链图片转存中…(img-fUknLPCg-1713382680646)]
2、狂刷面试题
技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。
①大厂高频45道笔试题(智商题)
[外链图片转存中…(img-zHM5Okwo-1713382680646)]
②BAT大厂面试总结(部分内容截图)
[外链图片转存中…(img-fIaiWkQX-1713382680646)]
[外链图片转存中…(img-eSlA1KKc-1713382680646)]
③面试总结
[外链图片转存中…(img-8sHeV0ay-1713382680646)]
[外链图片转存中…(img-tJpvzG3B-1713382680647)]
3、结合实际,修改简历
程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:
[外链图片转存中…(img-2HN8XQtL-1713382680647)]
以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!