Hibernate
一、类和类之间的关联关系
1、单向关联
public class User{
private Role role;
}
public class Role{
}
2、双向关联
public class User{
private Role role;
}
public class Role{
private Set<User> users=new HashSet<User>();
}
二、单向多对一关联
<many-to-one name="role" column="role_id" class="cn.hzhy.oa.entity.Role"></many-to-one>
三、单向一对多关联
<set name="users" cascade="save-update" inverse="true">
<key column="role_id" />
<one_to_many class="cn.hzhy.oa.entity.User"></on-to-many>
</set>
四、双向一对多关联
1、建立双向关联,配置映射信息
2、双向关联下的持久化操作
3、inverse属性:将维护主外键关系的控制权反转给多的一方,可以少执行SQL语句,提高性能
4、cascade属性:持久化一的一方时,自动级联持久化多的一方,可以简化编码
none
save-update
delete
all
五、延迟加载
1、为什么使用延迟加载
延迟加载策略能避免加载应用程序不需要访问的关联对象,避免了无谓的开销,从而提高了应用程序的性能。
2、什么是延迟加载?
延迟加载(lazy load懒加载)是当在真正需要数据时,才执行SQL语句进行查询。
3、Hibernate什么情况下会采用延迟加载
Hibernate中默认采用延迟加载的情况主要由以下几种:
(1)当调用Session上的load()方法加载一个实体时,会采用延迟加载。
(2)当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。
(3)当Session加载某个实体时,会对这个实体所单端关联的另一个实体对象采用延迟加载。
八、Hibernate延迟加载策略
1、类级别的查询策略
2、一对多和多对多关联的查询策略
(1)lazy属性为true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据
(2)(1)lazy属性为false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
(3)lazy属性为extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据
3、多对一关联的查询策略
(1)lazy属性默认为proxy: 返回一个代理对象
(2)lazy属性设置为no-proxy:在实例变量第一次被访问时应该延迟抓取(fetche lazily),需要运行时字节码的增强。
(3)lazy属性设置为false:指定此关联总是被预先抓取。
注意:如果constrained="false", 不可能使用代理,Hibernate会采取预先抓取!
九、Open Session In View模式实现延迟加载
1、实现原理:
Open Session In View模式的主要思想是: 在用户的每一次请求过程始终保持一个 Session对象打开着。
2、过滤器代码
/**
* Open Session In View模式过滤器
* Open Session In View模式的主要思想是: 在用户的每一次请求过程始终保持一个 Session对象打开着。
* @author Administrator
*
*/
public class OpenSessionInViewFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain filterChain) throws IOException, ServletException {
Session session=null;
Transaction tx=null;
try {
//获取Session
session=HibernateUtil.getSession();
//开始事务
tx=session.beginTransaction();
/*
* 执行过滤器链的doFilter()方法,调用下一个过滤器(如果存在)
* 或者Servlet(所有的过滤器都完成了预处理之后最终会到达Servlet)
*/
filterChain.doFilter(req, resp);
//提交事务
tx.commit();
} catch (HibernateException e) {
//回滚事务
if(tx!=null&&tx.isActive()){
tx.rollback();
}
e.printStackTrace();
}finally{
//关闭Session
HibernateUtil.closeSession();
}
}
public void init(FilterConfig arg0) throws ServletException {
}
}
Servlet生命周期分为那几个阶段?
1.初始化阶段,调用init()方法
2.响应客户请求阶段,调用service()方法
3.终止阶段,调用destroy()方法
过滤器的作用是什么?
过滤器可以再请求和响应之前做一部分预处理,有效的过滤掉不需要的内容,而且过滤器可以被复用,节省了大量的复用代码,提高java的代码执行效率。