`
kyo100900
  • 浏览: 639433 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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一下,才能万无一失。

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

分享到:
评论
2 楼 qingling600 2012-11-01  
是的。hibernate的context是一个重要的作用域,谢谢搂主,真是值得学习。
1 楼 jnbldw 2008-03-01  
我觉得第一段代码不会更新数据库,因为g对象没有与第二个session关联,因此他它不会被第二个session同步更新到数据库

相关推荐

    spring+hibernate项目

    然后,通过Spring的Context配置文件(如applicationContext.xml),将SessionFactory注入到需要的地方,并配置事务管理器。这样,当我们在Service层调用DAO方法时,Spring会自动处理SessionFactory的获取、关闭以及...

    spring,struts1.x ,hibernate整合

    Hibernate 的 SessionFactory 通常在 Spring 配置文件中被声明为单例 Bean,以便在需要的地方注入。 完成这些配置后,Spring 将管理 Struts Action 对象的生命周期,自动注入所需的 Dao 实例,而 Hibernate 则负责...

    spring注解整合hibernate

    使用`<context:component-scan>`注解扫描包含Hibernate实体类的包,`<bean>`标签定义SessionFactory和DataSource。 ```xml <context:component-scan base-package="com.example.entity"/> <!-- 数据库连接信息 --...

    将_Shiro_作为应用的权限基础_五:SpringMVC+Apache_Shiro+JPA(hibernate)整合配置

    通过本教程,您将了解关键配置文件的作用及其配置细节,包括`web.xml`、`applicationContext.xml`、`spring-mvc.xml`和`applicationContext-shiro.xml`。 #### 1. web.xml配置详解 `web.xml`文件是Web应用程序的...

    Spring MVC

    它提供了丰富的功能,包括请求处理、视图解析、数据绑定以及注解驱动的开发方式,使得开发者能够更加专注于业务逻辑,而无需关注底层的实现细节。 Spring MVC 弃用 Struts 等其他框架的原因在于其更好的可扩展性、...

    SSH框架整合jar包

    5. **整合Spring和Hibernate**:在Spring配置文件中配置SessionFactory,通过@Autowired或Resource注解注入到需要的地方。 6. **配置Struts2和Spring**:在Struts2的配置文件中启用Spring插件,让Struts2能够从...

    apache-log4j-1.2.15

    - **日志拦截**: 通过配置Log4j,可以拦截Hibernate的内部日志,了解其工作细节,如连接池管理、事务处理等。 - **性能监控**: 通过调整日志级别,记录SQL执行时间,有助于分析和优化数据库性能。 **4. Log4j ...

    spring-framework-4.3.5.RELEASE 源码

    2. **面向切面编程**:AOP是一种编程范式,允许开发者将关注点分离,如日志、事务管理等,这些都可以作为“切面”独立处理,而不是在每个需要它们的地方重复编写代码。Spring提供了一种声明式的方式来实现AOP,使得...

    框架笔记1

    Spring 提供了一种基础架构,允许开发者专注于业务逻辑,而不是基础设施的细节。它能够与其他框架如Struts、Hibernate、Mybatis等无缝集成,极大地提高了开发效率。 【IOC(依赖注入)】 Spring 的核心特性之一是...

    攻击JavaWeb应用.pdf

    - **context.xml和hibernate.cfg.xml**: 数据库连接信息通常配置在这些文件中,它们可能存在于应用的WEB-INF目录下或其他配置文件中。 #### JavaWeb应用的部署和启动流程 为了深入理解如何攻击JavaWeb应用,需要...

    Spring MVC 大型项目源码

    在这个大型项目源码中,我们有机会深入了解Spring MVC的实现细节以及如何在实际应用中使用它。 首先,`.classpath` 文件是Eclipse或类似的IDE使用的配置文件,它包含了项目所需的库和类路径信息。这可能包括Spring ...

    spring+jdbc开发环境

    在IT行业中,Spring框架是Java企业级应用开发的首选,而JDBC(Java Database Connectivity...在实际项目中,我们可能还需要考虑其他的细节,如异常处理、性能优化以及与其他技术(如MyBatis、Hibernate)的比较和选择。

    Spring面试题 75道1

    它是一个分层的JavaSE/JavaEE全栈框架,提供了一站式轻量级的解决方案,帮助开发者专注于应用程序的业务逻辑,而非基础设施的细节。Spring的主要目标是降低Java开发的复杂性,通过以下四个关键策略实现这一目标: 1...

    Spring整合JBPM、日志、数据库、ehcache的配置文件

    在提供的压缩包文件中,你应该能找到对应的XML配置文件,比如`spring-context.xml`、`log4j.properties`等,这些文件包含了上述组件的具体配置细节。通过解析和理解这些配置,你可以了解如何在实际项目中整合这些...

    笔试试题-J2EE开发技术

    ### 笔试试题-J2EE开发技术知识点解析 #### 一、选择题解析 ##### 1.... - **答案**:【C】...通过以上分析,我们对J2EE开发技术中的关键知识点进行了详细的解释和示例演示,希望能帮助理解相关概念和技术细节。

    jpa第一步:此存储库不断更新

    这些提供商提供了JPA的实现细节,使得我们可以在应用程序中使用JPA。 ### 3. 配置JPA 在项目中使用JPA,首先需要在`pom.xml`或`build.gradle`文件中添加相应的依赖,然后配置`persistence.xml`文件来指定JPA提供者...

    springmvc_1

    在本压缩包 "springmvc_1" 中,我们可以看到一个名为 "springmvc_1-main" 的文件,这通常代表了项目的主目录或者源代码存放的地方。以下将详细讲解 Spring MVC 的核心概念、工作原理以及如何使用它来开发 Web 应用。...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    充满了其他地方找不到的技术细节,而且深入剖析了Struts的内部机理。强烈推荐”  ——JosephBrutto,资深程序员 作者简介 作者:(加拿大)Budi Kurniawan 译者:杨涛 王建桥 杨晓云 Budi Kurniawan,世界知名的...

Global site tag (gtag.js) - Google Analytics