13hibernate hibernate关联关系的CRUD(增删改查)

本文详细介绍了Hibernate框架中实体关联的映射方式及其配置细节,包括cascade操作、fetch策略及双向关联的重要性等内容。
补充:
	在hibernate.cfg.xml中引入类
	<mapping class="com.hibernate.User"/>
	在hibernate.cfg.xml中引入xml文件
	<mapping resource="com/hibernate/User.hbm.xml"/>
	annotation和xml只需一种方式,所以根据使用引入其中一种即可

1.设定cascade可以设定在持久化时对于关联对象的操作
2.cascade仅仅是帮我们省了编程的麻烦而已,不要把它的作用看的太大
	a.cascade的属性指明做什么操作的时候关联对象是绑定在一起的
	b.merge = save + update
	c.refresh = A里面需要读B改过之后的数据
3.双向铁律:双向关系在程序中要设定双向关联(重要)
4.双向铁律:双向mappedBy
5.fetch
	(1)铁律:双向不要两边设置eager(会有多余的查询语句发出)
	(2)对多方设置fetch的时候要谨慎,结合具体应用,一般用lazy不用eager,
		特殊情况(多方数量不多的时候可以考虑,提高效率的时候可以考虑)
6.O/R Mapping编程模型
	(1)映射模型(数据库表结构)
		a.jpa annotation(现在使用)
		b.hibernate annnotation extension
		c.hibernate xml
		d.jpa xml
	(2)编程接口(具体增删改查)
		a.jpa
		b.hibernate(现在使用)
	(3)数据查询语言
		a.HQL
		b.EJBQL(JPQL) //是HQL的子集
7.要想删除或者更新,先做load,除了精确知道id之外
8.如果想消除关联关系,先设定关系为null,再删除对应记录,如果不删记录,
	该记录就变成垃圾数据
9.如果指定@OneToOne的属性fetch为lazy,会延迟对于关联对象的加载,
	不管是load还是get

a.C--create
	public class User
	{
		private int id;
		private String name;
		@ManyToOne(cascade={CascadeType.ALL})
		private Group group;
	}//加上cascade后可以省去s.save(g)这一步

	public void testSaveUser(){
		User u =new User();
		u.setName("u1");
		Group g = new Group();
		g.setName("g1");
		u.setGroup(g);//建立两者之间的关联

		Session s = sessionFactory.getCurrentSession();
		s.beginTransaction();
		s.save(g);//默认情况下不会自动保存关联变量
				  //解决办法:可以手动,也可以用cascade
		s.save(u);
		s.getTransaction().commit();
	}

	(1)删去s.save(u);而采用g.getUsers.add(u1);
		如果没有设置双向关联,则user的Group属性为空
	(2)双向关系在程序中要设定双向关联

b.R--retrieve
	public void testGetUser(){
		testSaveUser();

		Session s = sessionFactory.getCurrentSession();
		s.beginTransaction();
		User u = (User)s.get(User.class,1);
		//此时默认group也会被取出来
		
		s.getTransaction().commit();
	}

	(1)即取多方的时候一方会被取出,但是取一方的时候多方默认不会被取出
	(2)cascade影响的是CUD,读取的时候没有影响
	(3)fetch影响的是R,即load或get等其他方式的读取
		@OneToMany 最好设置fetch=FetchType.Lazy,默认是lazy
		@ManyToOne 默认是eager
	(4)@ManyToOne 用load方法取值,eager先取关联,
		lazy先取user
	(5)双向关联不要两边同时设置eager

c.U--update
	public void testUpdateUser(){
		testSaveUser();

		Session s = sessionFactory.getCurrentSession();
		s.beginTransaction();
		User u = (User)s.get(User.class,1);		
		s.getTransaction().commit();

		u.setName("user");
		u.getGroup().setName("group");

		Session s2 = sessionFactory.getCurrentSession();
		s2.beginTransaction();
		s2.update(u);//只有cascade是all的时候才会都更新		
		s2.getTransaction().commit();
	}

	(1)cascadeType是merge,只有merge操作才会级联;
		同理persist的cascade在persist操作下级联

d.D--delete
	public void testDeleteUser(){
		testSaveUser();

		Session s = sessionFactory.getCurrentSession();
		s.beginTransaction();
		User u = (User)s.load(User.class,1);
		//s.delete(u);
		//此时删除u1,再删除g1,再删除g1关联的所有user
		
		//若不设置cascade,解决办法(两者使用其一即可):
		//一是先解除关联关系
		//u.setGroup(null);
		//s.delete(u);

		//二是使用hql
		s.createQuery("delete from User u where u.id = 1").executeUpdate();
		s.getTransaction().commit();
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值