1、List集合:
以前我们用的都是Set集合,set是无序的,我们改成List
Department类:
public class Department{
private int id;
private String name;
private List<Employee> emps;
......
setter getter 方法
......
}
Department映射文件:
<class name="Department">
......
<list name="emps">
<key column="depart_id"/>
<!--Department中没有该属性,它是给hibernate用的,-->
<!--用来表示员工是第几个加入到部门的字段-->
<list-index column="order_col"/>
<one-to-many class="Employee"/>
</list>
......
</class>
假设我们用list,但是不关心顺序,怎配置文件如下:
<bag name="emps">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</bag>
2、Map集合:
Department类:
public class Department{
private int id;
private String name;
private Map<String,Employee> emps;
.....
getter、setter方法
.....
}
Department映射文件:
<class name="Department">
......
<list name="emps">
<key column="depart_id"/>
<!--map 的可以是String类型,对应的是员工表的name列-->
<map key type="String" column="name"/>
<one-to-many class="Employee"/>
</list>
......
</class>
3、级联
//cascade可以是save-update,也可是delete等
<set name="emps" cascade="all">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
就是Department的"员工"属性发生"保存"、"更新"、"删除"
时,对应的"员工"记录也发生相应的以上操作;
4、懒加载:(提高性能,避免不必要的数据库访问)
.....
User user=(User)session.load(User.class,id);
.....
我们强迫懒加载时去访问数据库:
.....
User user=(User)session.load(User.class,id);
Hibernate.initialize(user);//这样就会去访问数据库
.....
5、one-to-one懒加载:
主表不能有constrained=true,所以主表没有懒加载;
(1)lazy!=false;(默认就是true)
(2)constrained=true
(3)fetch=select
6、one-to-many:
(1)lazy!=false;(默认就是true)
(2)fetch=select
7、many-to-many:
(1)lazy!=false;(默认就是true)
(2)fetch=select
8、缓存的原理:
假设有1000人先后后要去相同的数据,这样就访问数据库1000;
这样就浪费资源,解决办法,hibernate为我们提供了缓存;
模拟缓存:
public class CaheDemo{
static Map cache=new HashMap();
public static void main(String[] args){
}
public User getUser(int id){
String key=User.class.getName()+id;
User user=(User)cache.get(key);
if(user!=null){//说明缓存中有数据
return user;
}
//说明缓存没有,然后从数据里查
user=getFromDataBase();
//查出来放入缓存中
cache.put(ke1y,user);
return user;
}
.........
}
当然在实际操作中hibernate为我们提供了缓存:
一级缓存,session 级共享:
save,update,saveOrUpdate,load,get,list,iterate,lock这些方法
都会将对象放在一级缓存中,一级缓存不能控制数量,所以在大批量
操作数据时可能会内存溢出,可以通过evict,clear方法清除缓存中的
数据;
session的缓存只存在于session中,session关闭缓存也就消失了;
二级缓存:(SessionFactory级别的缓存)
hibernate的二级缓存是用的三方 的;
因为是三方的所以我们需要在hibernate.cfg.xml中进行配置,这样hibernate
才会使用该二级缓存:
<!--是否使用二级缓存-->
<property name="cache.use_second_level_cache">true</property>
<!--告诉hibernate用的是哪个三方的二级缓存(当然需要引入jar包)-->
<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
当时实际使用中hibernate二级缓存的详细使用我们google一下:
就是"缓存的容量""哪些类需要缓存"怎么配置;
注:哪些类使用缓存我们也可以在映射文件中配置:
<cache usage="read-write"/>
save,update,saveOrUpdate,load,get,list,iterate,lock这些方法以及Query,Criteria都会
操作二级缓存;
ps:即使session关闭了,二级缓存中的数据还是存在的。
session.flush();-----让一级缓存与数据库同步
例子:
Class userClass=User.class;
Query q=session.createQuery("from User where id=:id");
q.setInteger("id",id);
q.uniqueResult();
===========
session.get(User.class,id);
以上两个的区别是 用get可以使用缓存;
9、sql查询:
......
Query q=session.createSQLQuery("select * from user");
......
hibernate学习笔记04---集合
最新推荐文章于 2020-11-10 16:01:13 发布