在做springmvc+hibernate的一个小实验 向数据库中插入一条数据
@Transactional注解不起作用 数据没插入也没报错 在dao层手动开启事务可以插入到数据库
折腾了很久 也看过很多解决方案似乎都没有效果
以下是spring的配置文件:
<!-- 配置自动扫描的包 -->
<context:component-scan
base-package="com.wymund.ssh" use-default-filters="false">
<!-- 扫描注解Repository -->
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Repository" />
<!-- 扫描注解Service -->
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Service" />
<!-- 下面设置不需要扫描的包(因为在springmvc文件中设置过了,springmvc扫描过的包这里不需要再扫描了) -->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>
<!-- 配置数据源 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置DataSource 连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.Url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 配置Hibernate相关属性 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation"
value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- 配置hibernate事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
springmvc的配置文件:
<context:component-scan base-package="com.wymund.ssh.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
Dao层的add方法:
@Override
public void addStudent(Student student) {
// Session session = HibernateUtils.getSession();
// Transaction transaction = session.beginTransaction();
// session.save(student);
// transaction.commit();
// session.close();
HibernateUtils.getSession().save(student);
}
service层的方法:
@Override
@Transactional
public void addStudent(Student student) {
studentDao.addStudent(student);
}
把dao层实现改为HibernateJdbcTemplate对象完成,就可以提交添加
而且交给spring事务管理时,主要针对批量操作或者是一组操作(类似转账,同时修改两个信息),为了保证数据安全性,一旦出错就立即回滚
对于单一添加功能,对于事务管理看不到效果