hibernate学习笔记04---集合

来源:互联网 发布:多线程ping java 编辑:程序博客网 时间:2024/06/08 16:29
1、List集合:以前我们用的都是Set集合,set是无序的,我们改成ListDepartment类: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=select6、one-to-many:(1)lazy!=false;(默认就是true)(2)fetch=select7、many-to-many:(1)lazy!=false;(默认就是true)(2)fetch=select8、缓存的原理:假设有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");......