hibernate学习笔记04---集合

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");
	......
		
		
		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bzuld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值