hibernate笔记总结(三)

2014-11-24 10:24:18 · 作者: · 浏览: 2
ist();
for(User u:us){
System.out.println(u);
}
//联合查询
StringBuffer hql = new StringBuffer();
hql.append("SELECT ");
hql.append(" d1.id,d1.nickname,count(d2.fullAddress) ");
hql.append(" FROM User d1 join d1.adrs d2 ");
hql.append(" GROUP BY d1.id");
Query query = session.createQuery(hql.toString());
List list=query.list();
for (int i = 0; i < list.size(); i++) {
Object[] obj = (Object[]) list.get(i);
System.out.println(obj[0] + " " + obj[1] + " " + obj[2]);
}
//联合查询
StringBuffer hql = new StringBuffer();
hql.append("SELECT ");
hql.append(" d1.user.id,d1.user.nickname,count(d1.fullAddress) ");
hql.append(" FROM Address d1 ");
hql.append(" GROUP BY d1.user.id");
Query query = session.createQuery(hql.toString());
List list=query.list();
for (int i = 0; i < list.size(); i++) {
Object[] obj = (Object[]) list.get(i);
System.out.println(obj[0] + " " + obj[1] + " " + obj[2]);
}


============================================
(了解)3.Hibernate高级特性以及性能优化
1)延迟加载 : 当程序执行getter方法获取时,才发送sql语句加载数据.
延迟加载给程序带来好处,但是要避免session过早关闭问题
a. load()和get()两个方法区别
load()采用延迟加载机制,返回的是一个proxy代理对象
get()没有采用延迟加载,返回的是一个对象实例
b.Hibernate.initialize(user)
可以强制user对象实例化
c.hbm映射描述文件中,,,等元素
都可以使用lazy属性,默认lazy="true",启用延迟加载
lazy="false"禁用延迟加载.
2)缓存机制
Hibernate每次查询先去缓存中查找,没有才去数据库查询.

a.一级缓存
Session级别的缓存,缓存load,get出来的单个对象.默认开启.
使用同一个Session对象多次查询同一个User对象,
只会发送一次SQL取数据库获取
b.二级缓存
SessionFactory级别的缓存.默认情况是关闭.
(1)首先在hibernate.cfg.xml中指定EhCache缓存策略

org.hibernate.cache.EhCacheProvider

(2)在src下添加ehcache.xml配置文件
(3)在User.hbm.xml中添加定义

,如果涉及更新,使用read-write

c.查询缓存
缓存HQL查询结果集,对相同的HQL查询语句,只去数据库查询一次.
(1)首先在hibernate.cfg.xml中启用查询缓存
true
(2)在query.list()执行之前,调用query.setCacheable(true);
d.缓存的清除
session.evict(user);//清除缓存中的指定对象
session.clear();//清除缓存的所有内容
sessionfactory.evict();//清除二级缓存中的指定对象


================================================================
==========补充===============
1. 关系维护交给对方,
关系维护指的是update关系字段的值
A id <---> B a_id
1001 1001--->NULL
2.cascade级联操作
一对一:可以使用级联删除
一对多,多对多:删除操作等不推荐使用级联,
级联删除效率低,可以写HQL执行
HQL : delete from Item where order.id=
HQL : delete from Order where id=
3.自定义主键生成方式
参考(Student示例)
4.query.list()和query.iterator()
1)list将所有记录获取,放入list集合中
2)iterator先将记录的主键获取,然后需要哪个记录,
再根据主键条件去数据库查询.