一面向对象主要研究什么?
答:类与类的关系。
- 继承:”is-a“的关系 人类和猪类—-不是继承关系 不满足is-a关系 学生类和大学生类—是继承关系 满足is-a关系
- 实现:类与接口(特殊类)
- 依赖:人与船属于依赖关系 A类 依赖 B类
- 关联:关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
- 聚合:整体与部分可分割,是拥有关系,既has-a关系 组合:是contains-a关系,体现整体与部分不可分割
二 hibernate 中类与类的关系
- 一对一:就好比一个人只有一张身份证
- 一对多:就像那作者可以写多本书
- 多对多:比如一个班的学生有多科老师。然而每一个老师一般都有很多学生
一。一对一
hibernate的一对一关系的映射文件
- 首先需要在实体类加上对方的实体类对象 (在用户表里面加上身份证表的对象)(在身份证表里面加上用户表的对象)
并且生成get()和set()方法 - 在映射文件的中添加在俩张表的关系一般是写在底部的(方便阅读)
< one-to-one name="person" class="com.kz.entity.Person"></one-to-one>
//name:在该表中的属性名(对方的实体类对象名)
//class:对方实体类的路径 注意在俩个映射文件中都要写 主的一方需加上级联 cascade="all"
- 一对一的增删改查
- 查询
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");//读取配置文件 如果不写默认就是在src根目录下
SessionFactory sf = cfg.buildSessionFactory();//构建SessionFactory会话工厂
Session session = sf.openSession();//得到会话对象
//根据身份证在到那一个人的名字
Card c = (Card) session.get(Card.class, 4L);//找到id为4的身份证
Person p=c.getPerson();//这个就是身份证id为4 的那个人
//根据人找到那一张身份证
Person person = (Person) session.get(Person.class,3L);//找到id为3的人
Card c=person.getCard();//这个就是id为3的那张身份证对象
session.close();//关闭会话对象
sessionFactory.close();//关闭工厂
- 增删改 注意只要是对数据库进行了数据上的改动就必须写事务开启与提交事务
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
Transaction transaction = session.beginTransaction();//事务开始
//1增加
//1.1添加一个新人和卡
Person p = new Person();
p.setPname("拉登3");
Card card = new Card();
card.setCname("大王卡7");
//相互认识
p.setCard(card);
card.setPerson(p);
//添加
session.save(p);//因为级联所以只需要添加主的一方就好
//1.2查人补卡
Person person = (Person) session.get(Person.class,3L);
Card card2 = new Card();
card2.setCname("芒果卡");
//相互认识
person.setCard(card2);
card2.setPerson(person);//因为person是持久层所以不需要写
//1.3查卡补人 一般不会这么用 毕竟谁会人丢了卡没丢
Card c = (Card) session.get(Card.class, 4L);
Person p = new Person();
p.setPname("三狗子");
//相互认识
p.setCard(c);
c.setPerson(p);
session.save(p);//因为级联的是主的一方 而需要写save
//2删除
//2.1查人 删人删卡
Person person = (Person) session.get(Person.class,6L);
session.delete(person);
//2.2查人 删卡
Person person = (Person) session.get(Person.class,6L);
person.setCard(null);
session.delete(card);//断绝关系 主的一方断绝 如果不断绝是会连着卡一起删除的 因为在session里面存着person 然而person表中有card对象所以查出来的session中也有card 只要 person.setCard(null)之后就再删除person 就不会删除Card
//2.3查卡 删人
Card c = (Card) session.get(Card.class, 4L);
Person person = c.getPerson();
//断关系 主的一方断
person.setCard(null);
session.delete(person);
//3修改
//3.1查人修改卡
Person person = (Person) session.get(Person.class,3L);
Card c = person.getCard();
c.setCname("医保卡");
//session.update(c);可以省略 c是持久态对象
//3.2查卡修改人
Card c = (Card) session.get(Card.class, 2L);
Person person = c.getPerson();
//person持久态对象
person.setPname("大白");
//3.3查人修改人
Person person = (Person) session.get(Person.class,3L);
person.setPname("大白");
//3.4查卡修改卡
Card c = (Card) session.get(Card.class, 2L);
c.setCname("医保卡");
transaction.commit();//事务提交
session.close();
sf.close();
二。一对多
hibernate 一对多关系的映射文件
- 首先需要想清楚什么俩张表里面是是唯一的 ,就好比街道表与大区表,一条街道肯定只有一个大区,然而一个大区肯定不止一条街道。紧接着就设置大区表为主,街道表为辅。
- 主 在实体类里需要添加一个set集合 注意要加上set集合的get(),set()方法 并且给set集合初始化 否则会出现空指针异常