hibernate的context的细节地方

Hibernate的Session是它的灵魂,则Session所掌握的context作用域也是Hibernate发挥最大本领的场所
考虑以下代码, Group与User一个典型的一对多关系:

 

Session session = HibernateSessionFactory.getSession();
		Group g = (Group) session.get(Group.class, id);
		Hibernate.initialize(g.getUsers());
		session.close();
		
		session = HibernateSessionFactory.getSession();
		assertEquals("superleo", g.getName());
		assertTrue(null != g.getUsers());
		User u = g.getUsers().get(0);
		assertEquals("rose2", u.getName());
		u.setName("rose");
		session.getTransaction().commit();
		session.close();


与代码:

 

Session session = HibernateSessionFactory.getSession();
		session.beginTransaction();
		Group g = (Group) session.load(Group.class,
				"402881ee174998f901174998fb8a0002");
		assertEquals("superleo", g.getName());
		assertTrue(null != g.getUsers());
		User u = g.getUsers().get(0);
		assertEquals("rose2", u.getName());
		u.setName("rose");
		session.getTransaction().commit();
		session.close();

 

粗略的看,两段代码没有什么特别的地方,都是通过“一方”来级联更新“多方”,因此应该有不少人不会太注意这样的写法吧。仔细一看, 原来session开了两次。 刚才说了,hibernate的context是一个重要的作用域,可惜的是它的周期与具体的session绑定在一起,也就是说session.close() 就意味着一个context告一段落,再开启session的时候,当前的context与上一个是没有关系的

 

上面的两段代码因此执行后的结果是有很大差别的:

第一段代码的级联操作,会遍历整个“多方”,也就是说控制台会出现N条Update语句,

第二段代码只有一条Update语句(因为我代码只更新了一个“多方”)。

 

原因就是我说的当对象不处于Hibernate的context,它只是一个departed对像,与当前JVM上其它new出来,或反射出来的对象没有区别了,Hibernate不会再去维护它与数据库之间的关系。所以,当保存级联操作的时候,Hibernate并不知道“多方”究竟是谁变化了,只有都update一下,才能万无一失。

不知道,你的代码更多的是哪一种写法呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值