Hibernate学习

表关系

多对多 一对多 一对一
一对多
建表原则: 在多的一方创建外键指向一的一方的主键
多对多
建表原则: 创建一个中间表,中间表中至少两个字段作为外键分别指向多对多双方的主键
一对一
建表原则有两种:
一种: 唯一外键对应: 假设一对一的任意一方为多,在多的一方创建外键指向一的一方的主键,然后将外键设置为唯一。
二种: 主键对应: 一方的主键作为另一方的主键。

一对多创建映射

(客户的映射)
<!--
set 标签: 
	* name属性: 多的一方的集合的属性名称
-->
<set name="linkeManks">
	<!--
		key标签: 
			* column属性: 多的一方的外键名称
	 -->
	 <key column="lkm_cust_id"></key>
	 <!-- 
	 	one-to-manys标签:
	 		* class属性: 多的一方的类全路径
	 -->
	 <one-to-many class="cn.itcast.hibernate.domain.LinkMan"/>
</set>
(联系人映射)
<!-- 配置关联对象: -->
<!-- 
	many-to-one:标签,代表多对一
		* name: 一的一方的对象的名称
		* class: 一的一方的类的全路径
		* column: 表中的外键的名称
 -->
 	<many-to-one name="customer" class="cn.itcast.hibernate.domain.Customer" column="lkm_cust_id"/>

当进行了双向的关联关系的设置,那么我们还保存了双方,如果只保存一方就会出现:瞬时对象异常,一个持久态对象关联了一个瞬时态对象,那么我们不能只保存一方。如果只想保存一方,那么我们可以使用Hibernate的级联操作

级联操作

级联操作的指当主控方执行保存、更新或者删除操作时,其关联对象(被控方)也执行相同的操作。在映射文件中通过对cascade属性的设置来控制是否对关联对象采用级联操作,级联操作对各种关联关系都是有效的。
cascade=“save-update” 保存的时候,关联对象也操作
cascade=“delete”
cascade=“delete,save-update” 两个都级联操作
inverse=“true”
inverse的默认值是false,代表不放弃外键维护权,配置值为true,代表放弃了外键的维护权。这个时候再来执行之前的操作。

区分cascade 和 inverse

如果在set集合上配置cascade=“save-update” inverse="true"了,那么执行保存客户的操作,会发现客户和联系人都进入到数据库了,但是没有外键,是因为配置了cascade了所以客户关联的联系人会进入到数据库,但是客户一端放弃了外键维护权,所以联系人插入到数据库以后是没有外键的。

Hibernate的检索方式

Hibernate的检索方式主要有5种,分别为导航对象图检索方式、OID检索方式、HQL检索方式、QBC检索方式和SQL检索方式。

对象图导航检索

对象图导航检索方式是根据已经加载的对象,导航到他的关联对象。它利用类与类之间的关系来检索对象。譬如要查找一个联系人对应的客户,就可以由联系人对象自动导航找到联系人所属客户对象。当然前提是必须在对象关系映射文件上配置了多对一的关系。其检索方式如下所示。

LinkMan linkMan = (LinkMan)session.get(LinkMan.class,1l);
Customer customer = linkMan.getCustomer();

OID检索方式

OID检索方式主要指用Session的get()和load()方法加载某条记录对应的对象。如下面两种加载客户对象的方式,就是OID检索方式,具体如下。

Customer customer = (Customer)session.get(Customer.class,1);
Customer customer = (Customer)session.load(Customer.class,1);

HQL检索

HQL(Hibernate Query Language)是面向对象的查询语句,它和SQL查询语言有些相似,但它使用的类、对象和属性的概念,而没有表和字段的概念。在Hibernate提供的各种检索方式中,HQL是官方推荐的查询语言,也是使用最广泛的一种检索方式。它具有如下功能。

  • 在查询语句中设定各种查询条件。
  • 支持投影查询,即仅检索出对象的部分属性。
  • 支持分页查询。
  • 支持分组查询,允许使用group by和having关键字。
  • 提供内置聚集函数,如sum()、min()和max()
  • 能够调用用户定义的SQL函数
  • 支持子查询,即嵌套查询。
  • 支持动态绑定参数。

QBC检索

QBC(Query By Criteria)是Hibernate提供的另一种检索对象的方式,它主要是由Criteria接口、Criterion接口和Expression类组成。Criteria接口是HibernateAPI中的一个查询接口,它需要由session进行创建。Criterion是Criteria的查询条件,在Criteria中提供了add(Criterion criterion)方法来添加查询条件。
QBC检索是使用Restrictions对象编写查询条件,在Restrictions类中提供了大量的静态方法来创建查询条件。
类有很多,比如文章(https://www.cnblogs.com/hahajava/p/9445480.html)

离线条件检索

DetachedCriteria翻译为离线条件查询,因为它是可以脱离Session来使用的一种条件查询对象,我们都知道Criteria对象必须由Session对象来创建。那么也就是说必须先有Session才可以生成Criteria对象。而DetachedCriteria对象可以在其他层对条件进行封装。

采用HQL或QBC检索方式时,Hibernate生成标准的SQL查询语句,适用于所有的数据库平台,因此这两种检索方式都是跨平台的。但有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。

SQL多表联合查询

连接查询:
交叉连接
交叉连接返回的结果是被连接的两个表中所有的数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据行乘以第二个表中符合查询条件的数据行数。
内连接
内连接(INNER JOIN)又称简单连接或自然连接,是一种常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的记录,也就是说在内连接查询中,只有满足条件的记录才能出现在查询结果中。
隐式内连接: 顾名思义隐式的就是我们看不到inner join的关键字。而是用where关键字替代。
显示内连接: 显示的就是在语句中明显的调用了inner join的关键字
外连接
外连接分为左连接和右连接
左连接: 返回包括左表中的所有记录和右表中符合连接条件的记录,右连接相反

HQL连接查询

HQL的多表连接查询分类多了迫切内连接 迫切左外连接 (加了fetch的区别)

HIbermate的抓取策略和延迟加载

延迟加载

延迟加载(lazy laod)是(也称为懒加载)Hibernate关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销提出来的。
延迟加载分为两类: 一类叫做类级别延迟,另一类叫做关联级别的延迟。类级别的延迟指的是查询某个对象的时候,是否采用有延迟,这个通常在标签上配置lazy属性。关联级别的延迟指的是,查询一个对象的关联对象的时候是否采用延迟加载。这通常在或上配置lazy属性。
标签上的lazy通常有三个取值:

  • true: 默认值,采用延迟加载
  • false: 检索关联对象的时候,不采用延迟加载
  • extra: 及其懒惰的

标签上的lazy通常有三个取值:

  • proxy: 默认值,是否采用延迟取决于一的一方类上lazy属性的值。
  • false: 检索关联对象的时候,不采用延迟加载。
  • no-proxy: 不用研究。

标签上的fetch通常有三个取值:

  • select: 默认值,发送的是普通的select语句查询。
  • join: 发送一条迫切左外连接去查询。
  • subselect: 发送一条子查询语句查询其关联对象。

标签上的fetch有两个取值:

  • select: 默认值,发送一条普通的select语句查询关联对象。
  • join: 发送一条迫切左外连接语句查询其关联对象。

抓取策略

batch-size属性: 设定一次初始化 set 集合的数量
用法看文章 https://blog.csdn.net/pipizhen_/article/details/108366284

有篇黑马的 https://blog.csdn.net/bellediao/article/details/111999547

以上内容从黑马摘抄

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值