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

Hibernate session,transaction

阅读更多
在Hibernate中,session建立时如getCurrentSession();不会获取数据库的链接,只有在beginTransaction()时才会从链接池里得到链接,默认情况下当事务commit或者rollback时session会flush,随后链接会被释放,新的事务会得到新的链接。

在使用spring整合hibernate时,一般采用代理模式来管理 事务,所以在 dao里,不需要我们手动的去获取 transaction和 commit事务。例如下面的代码所示。
<bean id="txManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref local="sessionFactory" />		</property>
	</bean>

	<bean id="transactionInterceptor"
		class="org.springframework.transaction.interceptor.TransactionInterceptor">
		<property name="transactionManager">
			<ref bean="txManager" />
		</property>
		<property name="transactionAttributes">
			<props>
				<prop key="search*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
				<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>	
		
				<prop key="*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>

	<!-- BeanNameAutoProxyCreator -->
	<bean id="autoProxyCreator"
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="interceptorNames">
			<list>
				<value>logInterceptor</value> 
				<value>transactionInterceptor</value>
			</list>
		</property>
		<!-- Add all the services to here for transaction and rollback -->
		<property name="beanNames">
			<list>
				<!-- put in service interfaces here for transaction management -->

				<idref bean="registrationService" />
			</list>
		</property>
	</bean>


以前我一直有疑问,因为在dao里执行完某个查询操作后,session就会被关闭。这样得到的就是个detached对象,很多情况下就应该有LazyInitializationException。我一直都不明白开发架构是如何解决这个问题的。

《java persistence with hibernate》的16章有相关的描述,一种解决方法是Open Session in View (OSIV),这种比较好理解,就是利用filter扩展整个session,"leave the persistence context open until the view is completely rendered."。它适用于“the presentation,business,and persistence layers are colocated on the same virtual machine.” 我们所要做的就是在web.xml加上
<filter>
		<filter-name>sessionFilter</filter-name>
		<filter-class>
                      org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
		</filter-class>
	</filter> 
        <filter-mapping>
		<filter-name>sessionFilter</filter-name>
		<url-pattern>*.faces</url-pattern>
	</filter-mapping>


如果是分布式系统里OSIV就不行了,只得用其他的解决方法,如session facade, DTO(data transfer object) and command。
分享到:
评论

相关推荐

    Hibernate_Session_Transaction

    在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...

    HibernateSession , Transaction 研究

    本文将深入研究Hibernate中的`Session`和`Transaction`,这两个概念是理解Hibernate工作原理的关键。 首先,让我们了解`Session`。在Hibernate中,`Session`充当了应用程序与数据库之间的桥梁,它是持久化操作的...

    Hibernate+Transaction+myeclipse6+事例+工程源码.rar

    《深入理解Hibernate+Transaction在MyEclipse6中的应用实践》 在现代的Java Web开发中,数据持久化是一个至关重要的环节。Hibernate作为一种流行的Object-Relational Mapping(ORM)框架,极大地简化了数据库操作,...

    Hibernate Session释放模式

    在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...

    hibernate session生命周期示例

    本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...

    hibernate和session学习

    【hibernate与Session详解】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,我们可以将数据库中的表与Java类进行映射,从而实现对...

    对Hibernate Session做一个简单的包装

    1. **事务管理**:在执行一系列数据库操作时,我们可以使用`Session`的`beginTransaction()`和`commit()`方法开启和提交事务。为了确保数据一致性,我们需要在发生异常时回滚事务,这可以通过`Session`的`rollback()...

    Hibernate(session管理)

    本文将深入探讨Hibernate中的核心概念——Session管理。 首先,理解Session在Hibernate中的角色至关重要。Session是Hibernate的主要工作单元,它是应用程序与数据库之间的桥梁。它负责保存、检索和更新Java对象,...

    Hibernate的Session的javadoc

    Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...

    hibernate session详细方法,值得珍藏

    在事务管理方面,Session提供了`beginTransaction()`方法来开启一个事务,这标志着一个数据库操作单元的开始。在事务中执行的数据库操作,如`save()`, `update()`, `delete()`等,都会被事务隔离,并在事务提交(`...

    hibernate session.doc

    Transaction tx1 = session1.beginTransaction(); // 加载一个持久化对象 Customer customer = (Customer) session.get(Customer.class, new Long(1)); session.delete(customer); // 计划执行一个delete语句 tx1...

    hibernate中session的管理

    1. **Session per Request/Transaction**:每个HTTP请求或数据库事务分配一个Session。这通常是Web应用程序的最佳实践,因为HTTP请求是天然的线程边界。 2. **Session per Thread**:在多线程应用中,可以为每个...

    Hibernate_11session

    《深入理解Hibernate Session:从配置到实践》 Hibernate,作为Java领域中一款广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。在Hibernate中,Session是连接应用程序和数据库的重要桥梁,它负责对象...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    本篇文章主要关注如何通过Hibernate的Session接口来操纵对象,实现数据的持久化。 首先,我们需要理解Session在Hibernate中的角色。Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、...

    详解Hibernate事务处理机制

    Transaction transaction = session.beginTransaction(); ``` ##### 4.2 提交与回滚 事务提交或回滚决定了事务是否生效。成功完成事务操作后,应调用`transaction.commit()`;若出现异常情况,则调用`transaction....

    hibernate关于session的关闭实例解析

    session.beginTransaction(); session.save(student); session.flush(); session.getTransaction().commit(); ``` 总结 本文详细介绍了 Hibernate 中 Session 的关闭实例解析,包括 getSession() 和 openSession() ...

    Hibernate对BLOB CLOB操作

    import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.lob.SerializableBlob; import org.hibernate.lob.SerializableClob; import org.hibernate.type.BlobType; ...

    hibernate5--2.数据持久化及事务

    数据持久化是通过Hibernate的核心接口Session来实现的。Session提供了对数据库的 CRUD(创建、读取、更新、删除)操作,它是连接应用程序和数据库的桥梁。在Hibernate中,对象的状态有三种:瞬时态、持久态和脱管态...

    hibernate的缓存机制和session对象的产生方式案例

    Hibernate提供Transaction API,允许在Transaction边界内自动创建和关闭Session。通过begin()开启事务,Hibernate会自动创建Session,然后在commit()或rollback()时关闭Session。这种方法简化了代码,但可能导致...

    JAVA的hibernate手动获取session的方法

    本篇将详细讲解如何在Hibernate中手动获取Session,以及涉及到的相关配置和连接管理。 首先,理解Hibernate的核心组件——Session。Session是Hibernate中的工作单元,它是与数据库交互的主要接口,负责保存、更新和...

Global site tag (gtag.js) - Google Analytics