Hibernate4

Hibernate的多表操作:
1、交叉连接
2、内连接
显示内连接
sql: select * from 表A inner join 表B on 关联条件
hql: from 类 X inner join X.另在该的引用 with 条件
隐式内连接关联条件
hql: from 类 X where X.另在该的引用.关联外键对应
迫切内连接【****】
hql: select [distinct] X from 类 X inner join fetch X.另在该的引用
3、外连接
左外连接
sql: select * from 表A left join 表B on 关联条件
hql: from 类 X left join X.另在该的引用
右外连接
迫切左外连接【****】
hql: select [distinct] X from 类 X left join fetch X.另在该的应用

Hibernate的事务管理:
如何设置事务的隔离级别:
<property name="hibernate.connection.isolation">1/2/4/8</property>

Hibernate中的Session管理:
1、Session对象的生命周期与本地线程绑定(ThreadLoacl)【***】
2、Session对象的声明周期与JTA事务绑定(分布式事务管理)【***】
3、Hibernate委托程序管理Session的生命周期

如何在本地线程绑定Session:
配置:
<property name="hibernate.current_session_context_class">thread</property>
获取:
通过sessionFactory.getCurrentSession()获取Session

Hibernate的优化
HQL优化:
1、使用参数绑定
1.使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用用生成好的执行计划,这样做节省CPU时间和内存。
2.避免SQL注入
2、尽量少使用NOT
如果where子句中包含not关键字,那么执行时该字段的索引失效
3、尽量使用where来替换having
Having在检索出所有记录后才对结果集进行过滤,这和处理需要开销,而where子句限制记录数目,能减少开销
4、减少对表的操作
在含有子查询的HQL中,尽量减少对表的查询,降低开销
5、使用表的别名
当在HQL语句中连接多个表时,使用别名,提高程序阅读性,并把别名前缀与每个列上,这样一来,可以减少解析时间并减少列歧义引起的语法错误
实体的更新和删除:
在hibernate3以后支持hql的update与delete操作
update User u set u.age=20 where u.age=18

检索策略:
延迟加载:
1、类级别检索
2、关联级别检索
类级别检索:
1、在hbm配置文件的class上配置 --> lazy="true" 默认
2、在类上使用注解 --> @Proxy(lazy=true)
-->如果lazy设置为false后,load方法会与get一样,立即检索
-->对延迟代理对象初始化:
Hibernate.initialize(Object obj);
关联级别检索:
查询到某个对象,获得其关联的对象或属性,对应关联级别检索需要理解其检索策略(抓取策略)

检索策略(抓取策略):
一对多:
set上的fetch与lazy:
fetch:
select --> 多条简单sql --> 默认值
join --> 迫切左外连接
subselect --> 生成子查询
lazy:
ture --> 延迟检索 --> 默认值
false --> 立即检索
extra --> 加强延迟检索
在set上设置
@Fetch(FetchMode.SELECT)
@LazyCollection(LazyCollectionOption.TRUE)
--> 延迟查询
@Fetch(FetchMode.SELECT)
@LazyCollection(LazyCollectionOption.FALSE)
--> 立即查询
@Fetch(FetchMode.SELECT)
@LazyCollection(LazyCollectionOption.EXTRA)
--> 延迟查询,当需要查询个数是会发送count的sql语句,一般使用size(),contains(),isEmpty()等方法时不会直接查询
@Fetch(FetchMode.JOIN)
@LazyCollection(LazyCollectionOption.XXX)
--> 立即查询,当fetch设置为join时,lazy会失效,会发送迫切左连接查询
@Fetch(FetchMode.SUBSELECT)
@LazyCollection(LazyCollectionOption.TRUE)
--> 延迟查询,当需要关联信息时会发送子查询
@Fetch(FetchMode.SUBSELECT)
@LazyCollection(LazyCollectionOption.FALSE)
--> 立即查询,发送子查询
@Fetch(FetchMode.SUBSELECT)
@LazyCollection(LazyCollectionOption.EXTRA)
--> 延迟查询,当需要查询个数是会发送count的sql语句,一般使用size(),contains(),isEmpty()等方法时不会直接查询

多对一:
set上的fetch与lazy:
fetch:
select --> 多条简单sql --> 默认值
join --> 迫切左外连接
lazy:
proxy --> 是否延迟检索需要另一方的类级别延迟策略决定 --> 默认值
false --> 立即检索
no-proxy --> ...
在一的引用上设置:
@Fetch(FetchMode.SELECT)
@LazyToOne(LazyToOneOption.PROXY)
在一的一方设置类级别延迟:@Proxy(lazy=true)
--> 延迟查询,当【真正】需要关联信息是才会查询
@Fetch(FetchMode.SELECT)
@LazyToOne(LazyToOneOption.PROXY)
在一的一方设置类级别延迟:@Proxy(lazy=false)
--> 立即查询
@Fetch(FetchMode.SELECT)
@LazyToOne(LazyToOneOption.FASLE)
在一的一方设置类级别延迟:@Proxy(lazy=true)
--> 立即查询
@Fetch(FetchMode.JOIN)
@LazyToOne(LazyToOneOption.XXX)
在一的一方设置类级别延迟:@Proxy(lazy=true)
--> 立即查询,当fetch设置为join时,lazy会失效,会发送迫切左连接查询

批量抓取:
--> 解决N+1问题
通过查询一查询对应多的信息:
在set上加注解:
@BatchSize(size=n)
通过查询多查询对应一的信息:
在一的类上加注解:
@BatchSize(size=n)
注意事项:
无论根据哪一方查询另一方,在批量抓取是都是在父方设置,有外键的表示子方
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值