`
duyangsss
  • 浏览: 127412 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于spring中配置hibernate申明事务无效的问题

 
阅读更多
在spring配置hibernate的申明事务的时候,发现事务控制一直都不好使,关键配置如下:
spring的MVC的配置如下:
    <context:component-scan base-package="com.going"/> 
	<context:annotation-config />

	<!-- To enable @RequestMapping process on type level and method level -->
	<bean
		class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="marshallingConverter" />
				<ref bean="jsonConverter" />
				<ref bean="atomConverter" />
			</list>
		</property>
	</bean>

	<!-- XML Converter -->
	<bean id="marshallingConverter"
		class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
		<constructor-arg ref="jaxbMarshaller" />
		<property name="supportedMediaTypes" value="application/xml" />
	</bean>

	<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
		<property name="classesToBeBound">
			<list>
				<value>com.going.sample.domain.Employee</value>
				<value>com.going.sample.domain.EmployeeList</value>
			</list>
		</property>
	</bean>

	<!-- JSON Converter -->
	<bean id="jsonConverter"
		class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
		<property name="supportedMediaTypes" value="application/json" />
	</bean>

	<!-- ATOM Converter -->
	<bean id="atomConverter"
		class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter">
		<property name="supportedMediaTypes" value="application/atom+xml" />
	</bean>

	<!-- Client -->
	<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
		<property name="messageConverters">
			<list>
				<ref bean="marshallingConverter" />
				<ref bean="jsonConverter" />
				<ref bean="atomConverter" />
			</list>
		</property>
	</bean>
	<!-- viewer -->
	<!-- xmlView -->
	<bean id="xmlView"
		class="org.springframework.web.servlet.view.xml.MarshallingView">
		<constructor-arg ref="jaxbMarshaller" />
	</bean>
	<!-- jsonView -->
	<bean id="jsonView"
		class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

	<bean
		class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
		<property name="mediaTypes">
			<map>
				<entry key="json" value="application/json" />
				<entry key="xml" value="application/xml" />
				<entry key="html" value="text/html" />
			</map>
		</property>
		<property name="viewResolvers">
			<list>
				<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
				<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
				<bean id="viewResolver"
					class="org.springframework.web.servlet.view.UrlBasedViewResolver">
					<property name="viewClass"
						value="org.springframework.web.servlet.view.JstlView" />
					<property name="prefix" value="/WEB-INF/view/jsp/" />
					<property name="suffix" value=".jsp" />
				</bean>
			</list>
		</property>
	</bean>



applicationContext.xml的配置如下:
<!-- 数据源的配置 -->
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource" 
		destroy-method="close"
		p:driverClassName="${jdbc.driverClassName}"
		p:url="${jdbc.databaseurl}" 
		p:username="${jdbc.username}"
		p:password="${jdbc.password}" />

<!-- hibernate工厂类的配置 -->	
<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation">
			<value>classpath:hibernate.cfg.xml</value>
		</property>
		<property name="configurationClass">
			<value>org.hibernate.cfg.AnnotationConfiguration</value>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.jdbc.fetch_size">25</prop>
                <prop key="hibernate.jdbc.batch_size">50</prop>
                <!-- dev -->
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.generate_statistic">false</prop>
                <!-- cache -->
                <!--代表是否使用查询缓存,这里不使用,因为一般而言查询缓存的命中率并不是很高,所以我们没有 必要为每一个用户的查询缓存它的数据,所以这里设为false-->
                <prop key="hibernate.cache.use_query_cache">false</prop>
                <!--代表使用Hibernate的二级缓存-->
                <prop key="hibernate.cache.use_second_level_cache">false</prop>
                <!-- create db table -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>				
			</props>
		</property>
	</bean>

	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

在以上配置的情况下,无论我的service怎么配置@Transactional注解,都无效,如:

@Service
@Transactional
public class ContactServiceImpl implements ContactService {
	
	@Autowired
	private ContactRepository contactRepository;
	
	

	public ContactRepository getContactRepository() {
		return contactRepository;
	}

	public void setContactRepository(ContactRepository contactRepository) {
		this.contactRepository = contactRepository;
	}

	@Transactional(propagation=Propagation.REQUIRED)
	public void addContact(Contact contact) {
		contactRepository.addContact(contact);
	}

	public List<Contact> listContact() {
		return contactRepository.listContact();
	}

	@Transactional(readOnly = true)
	public void removeContact(String id) {
		contactRepository.removeContact(id);
	}
}

即使我在removeContact方法中添加只读控制readOnly = true,相关删除实体操作一样能够正常执行。
后面在网上搜了一些信息,问题在于spring在实例化@Controller类时,Spring会自动把关联的@Service(此@Service已做了@Transaction事务注解)类实例化,此时事务并未生效,导致@Transaction注解无效,事务未被注册。解决办法如下:
将spring的mvc配置中的以下信息:
<context:component-scan base-package="com.going" /> 

修改为:
    <context:component-scan base-package="com.going"> 
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> 
    </context:component-scan> 

表示容器在使用注解加载控制层时,不实例化控制层以外的组件。
除此以外,也将applicationContext.xml文件中添加如下的配置:
    <context:component-scan base-package="com.going"> 
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
    </context:component-scan> 

意思就是说使用注解加载除控制层以外的组件,这时,在加载service层时事务就会关联在服务层上,相关的事务注解的配置也就生效了。
分享到:
评论

相关推荐

    在Spring中配置Hibernate事务

    在Spring框架中集成和配置Hibernate事务管理是企业级Java应用中的常见实践,它能提供高效且灵活的事务处理策略。Spring作为一款强大的依赖注入(DI)和面向切面编程(AOP)容器,能够轻松地管理和协调不同数据访问...

    spring mvc+hibernate实现事务管理(配置文件版)

    本项目是关于如何使用Spring MVC与Hibernate结合来实现事务管理的实践教程,通过MyEclipse自动生成所需的包和配置文件。这里将详细讲解这一过程,以及涉及到的关键知识点。 首先,Spring MVC作为Spring框架的一部分...

    spring4配置hibernate3

    本文将详细探讨如何在Spring 4中配置Hibernate 3,以便实现数据持久化功能。这个压缩包文件“spring4-hibernate3-demo”很可能是包含了一个示例项目的源代码,用于演示这种集成。 首先,我们需要理解Spring 4和...

    spring3,hibernate4 配置声明式事务管理(annotation方式)

    总的来说,Spring 3和Hibernate 4结合使用声明式事务管理,使得我们无需在代码中显式调用事务开始、提交和回滚,而是通过注解和配置文件来声明事务的边界和行为。这种方式降低了代码的复杂度,提高了可维护性和可...

    spring3+hibernate4配置声明式事务管理(annotation方式)

    在Spring和Hibernate中,注解常用于配置和简化框架的使用,例如在类和方法上使用`@Transactional`进行事务管理,或使用`@Entity`、`@Table`等定义实体和表映射。 4. **声明式事务管理**:与编程式事务管理相比,...

    spring整合hibernate实现事务处理

    在`Spring_1800_Spring_Hibernate_Transaction_Annotation`这个压缩包文件中,很可能包含了使用注解方式实现Spring整合Hibernate事务处理的相关示例代码和配置文件。通过阅读和理解这些代码,你可以更好地掌握这一...

    Spring Hibernate事务实例

    本教程将深入探讨如何在Spring框架中利用`TransactionInterceptor`进行声明式事务管理,与Hibernate集成实现高效的数据库事务控制。 首先,了解事务管理是至关重要的。事务是一组数据库操作,这些操作要么全部成功...

    SpringAOP整合Hibernate并使用事务(模拟买书的过程)

    在本示例中,我们将探讨如何整合Spring AOP(面向切面编程)与Hibernate ORM框架,并利用它们来实现事务管理,模拟一个简单的买书过程。这个过程将涉及到数据库操作,事务的开始、提交和回滚,以及AOP在处理事务中的...

    spring配置hibernate事务

    在Spring框架中配置Hibernate事务管理是一项关键任务,它允许开发者以声明式的方式处理数据库操作的事务性,确保数据的一致性和完整性。以下是如何在Spring中配置Hibernate事务的详细步骤和概念解释。 首先,理解...

    spring 结合druid和hibernate使用jta配置分布式事务

    本篇将详细讲解如何在Spring环境中结合Druid数据源和Hibernate ORM框架,利用Atomikos实现JTA(Java Transaction API)来配置分布式事务。 首先,`Spring` 是一个开源的应用框架,它提供了AOP(面向切面编程)和DI...

    Spring+Hibernate注解事务实例

    - 首先,我们需要在Spring配置文件中启用事务管理器,通常是`HibernateTransactionManager`,并配置数据源。 - 然后,启用AOP代理,以便Spring可以在适当的时候处理事务。 2. **配置Hibernate**: - 创建...

    声明式事务控制spring+hibernate集成

    在"声明式事务控制,spring2.5+hibernate3集成源码"中,开发者可以学习如何配置Spring的事务管理器,以及如何在Hibernate的SessionFactory和SessionFactoryBuilder上使用Spring的TransactionProxyFactoryBean来创建...

    spring mvc+hibernate 实现事务管理(全注解版)

    2. **Hibernate事务**: Hibernate本身也提供了一种事务管理机制,但在Spring环境中,我们通常使用Spring的事务管理器来协调。当@Transactional注解应用于方法上,Spring会在该方法执行前后自动管理事务的开始和结束...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...

    memcache也spring,hibernate的配置

    标题中的“memcache也spring,hibernate的配置”指的是如何在Java开发环境中,结合Memcached缓存系统、Spring框架和Hibernate持久化框架进行集成配置。Memcached是一种高性能的分布式内存对象缓存系统,用于加速动态...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    在Hibernate中,你可以使用`Session`对象的`beginTransaction()`、`commit()`和`rollback()`方法来手动管理事务。例如,在一个业务服务方法中,你会先调用`beginTransaction()`,然后执行数据库操作,最后根据操作...

    SpringAOP整合Hibernate并使用事务

    Spring提供了声明式事务管理,这使得事务管理代码不再需要硬编码到业务逻辑中,而是通过配置来实现。AOP代理可以在方法调用前后自动执行事务相关的操作,如开启、提交、回滚事务,大大提高了代码的整洁度。 3. **...

    Spring2.5+hibernate搞定分布式事务

    Spring2.5+hibernate搞定分布式事务Spring2.5+hibernate搞定分Spring2.5+hibernate搞定分布式事务布式事务 第三部分

    spring hibernate 事务管理学习笔记(一)

    在Spring中,我们可以配置`PlatformTransactionManager`接口的实现类,如`HibernateTransactionManager`,它会自动感知Hibernate Session并管理事务。通过声明式事务管理,我们只需在方法上添加`@Transactional`注解...

Global site tag (gtag.js) - Google Analytics