Hibernate框架第三天

**课程回顾:Hibernate第二天**

1. 持久化类和一级缓存
* 持久化类:JavaBean + 映射的配置文件
* 持久化对象的三种状态
* 瞬时态
* 持久态:有自动更新数据的能力
* 托管态
* Session的一级缓存,快照机制
* 主键的生成策略

2. 管理事务
* 设置隔离级别
* 丢失更新的问题,乐观锁:添加属性version,配置<version name="version">
* 绑定本地的Session,事务需要service层开启,dao层需要使用Session对象

3. 查询的接口
* Query接口:HQL的查询
* Criteria接口:QBC查询(按条件进行查询)

----------

**今天内容**

1. Hibernate关联关系映射

----------

### 案例一:完成CRM的联系人的保存操作 ###

----------

**需求分析**

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

----------

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

1. JavaWEB中一对多的设计及其建表原则

2. 先导入SQL的建表语句
* 创建今天的数据库:create database hibernate_day03;
* 在资料中找到客户和联系人的SQL脚本

3. 编写客户和联系人的JavaBean程序(注意一对多的编写规则)
* 客户的JavaBean如下
public class Customer {
private Long cust_id;
private String cust_name;
private Long cust_user_id;
private Long cust_create_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<Linkman>();

}

* 联系人的JavaBean如下
public class Linkman {
private Long lkm_id;
private String lkm_name;
private String lkm_gender;
private String lkm_phone;
private String lkm_mobile;
private String lkm_email;
private String lkm_qq;
private String lkm_position;
private String lkm_memo;

private Customer customer;

}

4. 编写客户和联系人的映射配置文件(注意一对多的配置编写)
* 客户的映射配置文件如下
<class name="com.itheima.domain.Customer" table="cst_customer">
<id name="cust_id" column="cust_id">
<generator class="native"/>
</id>
<property name="cust_name" column="cust_name"/>
<property name="cust_user_id" column="cust_user_id"/>
<property name="cust_create_id" column="cust_create_id"/>
<property name="cust_source" column="cust_source"/>
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_linkman" column="cust_linkman"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>

<set name="linkmans">
<key column="lkm_cust_id"/>
<one-to-many class="com.itheima.domain.Linkman"/>
</set>
</class>

* 联系人的映射配置文件如下
<class name="com.itheima.domain.Linkman" table="cst_linkman">
<id name="lkm_id" column="lkm_id">
<generator class="native"/>
</id>
<property name="lkm_name" column="lkm_name"/>
<property name="lkm_gender" column="lkm_gender"/>
<property name="lkm_phone" column="lkm_phone"/>
<property name="lkm_mobile" column="lkm_mobile"/>
<property name="lkm_email" column="lkm_email"/>
<property name="lkm_qq" column="lkm_qq"/>
<property name="lkm_position" column="lkm_position"/>
<property name="lkm_memo" column="lkm_memo"/>

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

----------

**技术分析之保存客户和联系人的数据**

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

----------

**技术分析之级联保存**

1. 测试:如果现在代码只插入其中的一方的数据
* 如果只保存其中的一方的数据,那么程序会抛出异常。
* 如果想完成只保存一方的数据,并且把相关联的数据都保存到数据库中,那么需要配置级联!!

* 级联保存是方向性

2. 级联保存效果
* 级联保存:保存一方同时可以把关联的对象也保存到数据库中!!
* 使用cascade="save-update"

----------

**技术分析之级联删除**

1. 先来给大家在数据库中演示含有外键的删除客户功能,那么SQL语句是会报出错误的
* 例如:delete from customers where cid = 1;

2. 如果使用Hibernate框架直接删除客户的时候,测试发现是可以删除的

3. 上述的删除是普通的删除,那么也可以使用级联删除,注意:级联删除也是有方向性的!!
* <many-to-one cascade="delete" />

----------

**技术分析之级联的取值(cascade的取值)和孤儿删除**

1. 需要大家掌握的取值如下
* none -- 不使用级联
* save-update -- 级联保存或更新
* delete -- 级联删除
* delete-orphan -- 孤儿删除.(注意:只能应用在一对多关系)
* all -- 除了delete-orphan的所有情况.(包含save-update delete)
* all-delete-orphan -- 包含了delete-orphan的所有情况.(包含save-update delete delete-orphan)

2. 孤儿删除(孤子删除),只有在一对多的环境下才有孤儿删除
* 在一对多的关系中,可以将一的一方认为是父方.将多的一方认为是子方.孤儿删除:在解除了父子关系的时候.将子方记录就直接删除。
* <many-to-one cascade="delete-orphan" />

----------

**技术分析之让某一方放弃外键的维护,为多对多做准备**

1. 先测试双方都维护外键的时候,会产生多余的SQL语句。
* 想修改客户和联系人的关系,进行双向关联,双方都会维护外键,会产生多余的SQL语句。

* 产生的原因:session的一级缓存中的快照机制,会让双方都更新数据库,产生了多余的SQL语句。

2. 如果不想产生多余的SQL语句,那么需要一方来放弃外键的维护!
* 在<set>标签上配置一个inverse=”true”.true:放弃.false:不放弃.默认值是false
* <inverse="true">

----------

**技术分析之cascade和inverse的区别**

1. cascade用来级联操作(保存、修改和删除)
2. inverse用来维护外键的

----------

### Hibernate的关联关系映射之多对多映射 ###

----------

**技术分析之多对多的建表原则**

1. JavaWEB的多对多

----------

**技术分析之多对多JavaBean的编写**

1. 编写用户和角色的JavaBean
* 用户的JavaBean代码如下
public class User {
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private String user_state;

private Set<Role> roles = new HashSet<Role>();
}

* 角色的JavaBean代码如下
public class Role {
private Long role_id;
private String role_name;
private String role_memo;

private Set<User> users = new HashSet<User>();
}

2. 用户和角色的映射配置文件如下
* 用户的映射配置文件如下
<class name="com.itheima.domain.User" table="sys_user">
<id name="user_id" column="user_id">
<generator class="native"/>
</id>
<property name="user_code" column="user_code"/>
<property name="user_name" column="user_name"/>
<property name="user_password" column="user_password"/>
<property name="user_state" column="user_state"/>

<set name="roles" table="sys_user_role">
<key column="user_id"/>
<many-to-many class="com.itheima.domain.Role" column="role_id"/>
</set>
</class>

* 角色的映射配置文件如下
<class name="com.itheima.domain.Role" table="sys_role">
<id name="role_id" column="role_id">
<generator class="native"/>
</id>
<property name="role_name" column="role_name"/>
<property name="role_memo" column="role_memo"/>

<set name="users" table="sys_user_role">
<key column="role_id"/>
<many-to-many class="com.itheima.domain.User" column="user_id"/>
</set>
</class>

3. 多对多进行双向关联的时候:必须有一方去放弃外键维护权

----------

**技术分析之多对多的级联保存**

1. 级联保存
* <set cascade="save-update">

----------

**级联删除(在多对多中是很少使用的)**

1. 级联删除

原文地址:https://www.cnblogs.com/baibin-520/p/10107728.html

时间: 2024-08-06 08:39:32

Hibernate框架第三天的相关文章

Hibernate框架(三)框架中的关系映射

在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射,这些关系如何映射呢?这里简单总结一下: 一,一对多,多对一关系映射,这里拿学生和班级进行简单演示: 1,学生的类和对应的映射文件的编写: [java] view plaincopyprint? private int sid ; private String sname ; private Clas

一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一)

JPA(Java Persistence API)是Sun官方提出的一种Java持久化规范.为Java开发人员提供了一种对象/关系映射工具,管理Java应用中的关系数据.JPA的总体思想和现有Hibernate.TopLink等ORM框架大体一致.总的来说,JPA包括以下3方面的技术: 第一:ORM映射元数据 JPA支持XML和JDK 注释(也可译作注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中. 第二:Java持久化API 用来操作实体对象,执行

一步步学习Hibernate框架(四):采用jpa实现一对多关联映射(二)

上篇博客已经采用jpa注解来实现了一对多关联映射,将这种关联映射以外键的形式处理,现在来看看怎么以第三张表的形式处理.采用jpa注解来映射数据库要使用的jar包见上篇博客: 一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一) 现在看第二种方式:以第三张表的关系来体现 Group.java package com.tgb.zhudan; import java.util.List; import javax.persistence.CascadeType; import j

java:Hibernate框架(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态)

1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configurati

Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过Session持久化操作,缓存中存在这个对象的数据为持久状态并且数据库中存在这个对象对应的数据为持久状态这个时候有OID. 游离状态:当Session关闭,缓存中不存在这个对象数据而数据库中有这个对象的数据并且有OID为游离状态. 注:OID为了在系统中能够找到所需对象,我们需要为每一个对象分配一个

SSH(Struts2+Spring+Hibernate)框架搭建流程&lt;注解的方式创建Bean&gt;

此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblogs.com/wkrbky/p/5912810.html 一.Hibernate(数据层)的搭建: 实现流程 二.Spring(注入实例)的使用: 实现流程 三.Struts2(MVC)的搭建: 实现流程 这里注意一点问题: Struts2与Hibernate在一起搭建,antlr包,有冲突.MyE

Hibernate框架简介(二)基本使用增、删、改、查

一.Hibernate框架简介 Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具 1.1.理解持久化 瞬时状态:在程序运行的时候,有些程序数据是保存在内存中,当程序退出后,这些数据就不复存在了,所以称这些数据的状态为瞬时状态 持久状态:在使用一此软件的时候,有些数据,在程序退出后,还以文件等形式保存在硬盘或者数据库中,称这些数据的状态是持久状态 持久化:持久化就是将程序中的数据在瞬时状态和持久状态之间

hibernate框架总结

hibernate的pom.xml专门用于存放各种jar包下面是简单的几种 <dependencies>     <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-core</artifactId>           <version>4.2.21.Final</version> 

Hibernate框架基本使用

时间:2017-1-16 00:36 --什么是Hibernate Hibernate是一个开放源代码的关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以使用对象编程思维来操作数据库. Hibernate可以应用在任何使用JDBC的场景,既可以在Java的客户端程序使用,也可以在Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE框架中取代CMP,完成数据持久化的重任. Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数