spring声明式事务

分析:
通过编程方法实现事务控制
1、编写增强类,实现环绕增强(前置增强+后置增强)、抛出异常增强
使用spring提供三个事务控制对象,进行实现。

2、配置aop切面

声明式事务控制:
1、增强类由spring提供
2、aop的切面还需要程序员配置

  • dao:
package cn.itcast.crm.dao.impl;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import cn.itcast.crm.dao.CustomerDao;
import cn.itcast.crm.domain.CstCustomer;

//标识这个dao然后名字为:customerDao,如果不写value默认为类名首字母小写
//@Repository("customerDao")
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

	@Override
	public void insert(CstCustomer cstCustomer) { // 增加客户基本信息
		this.getHibernateTemplate().save(cstCustomer);
	}

	@Override
	public void delete(Long custId) { // 删除客户基本信息
		CstCustomer customer = this.getHibernateTemplate().get(CstCustomer.class, custId);
		this.getHibernateTemplate().delete(customer);

	}

	@Override
	public void update(CstCustomer cstCustomer) { // 修改客户基本信息
		this.getHibernateTemplate().update(cstCustomer);
	}

	@Override
	public CstCustomer findCustomerById(Long custId) { // 查询单个客户基本信息
		return this.getHibernateTemplate().get(CstCustomer.class, custId);
	}

	public Long findCustomerCount(DetachedCriteria detachedCriteria) {
		// 查询总数
		DetachedCriteria criteria = detachedCriteria.setProjection(Projections.rowCount());
		List list = this.getHibernateTemplate().findByCriteria(detachedCriteria);
		Long total = (Long) list.get(0);// 因为查到的是一个对象所以直接得到第一个就行了
		return total;
	}

	public List<CstCustomer> findCustomerList(DetachedCriteria detachedCriteria, int firstResult, int maxResults) {
		return (List<CstCustomer>) this.getHibernateTemplate().findByCriteria(detachedCriteria, firstResult,
				maxResults);
	}

}

  • service编写
  • `package cn.itcast.crm.service.impl;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;

import cn.itcast.crm.dao.CustomerDao;
import cn.itcast.crm.dao.CustomerDetailDao;
import cn.itcast.crm.domain.CstCustomer;
import cn.itcast.crm.domain.CstCustomerDetail;
import cn.itcast.crm.service.CustomerService;

//标识为service
//@Service(“customerService”)
public class CustomerServiceImpl implements CustomerService {
// @Autowired//按类型注入
private CustomerDao customerDao;
// @Autowired//按类型注入
private CustomerDetailDao customerDetailDao;
// 添加客户同时添加联系人、客户详细信息
public void insertCustomer(CstCustomer cstCustomer, CstCustomerDetail cstCustomerDetail) {
// 定义事务
// 保存客户信息
customerDao.insert(cstCustomer);
// 客户详细信息和客户信息保持一致
cstCustomerDetail.setCustId(cstCustomer.getCustId());
// 保存客户详细信息
customerDetailDao.insert(cstCustomerDetail);
}

// 查询客户列表总记录数
@Override
public long findCustomerCount(CstCustomer cstCustomer) {

// ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“classpath:spring/applicationContext.xml”);
// CustomerDao customerDao = (CustomerDao) applicationContext.getBean(“customerDao”);
//
// 拼接查询条件
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(CstCustomer.class);
if (cstCustomer != null) {
if (cstCustomer.getCustName() != null && !cstCustomer.getCustName().equals("")) {
// 拼接查询条件客户名称
detachedCriteria.add(Restrictions.eq(“custName”, cstCustomer.getCustName()));
}
}
return customerDao.findCustomerCount(detachedCriteria);
}

@Override
public List<CstCustomer> findCustomerList(CstCustomer cstCustomer, int firstResult, int maxResults) {
	// 拼接查询条件
	DetachedCriteria detachedCriteria = DetachedCriteria.forClass(CstCustomer.class);
	if (cstCustomer != null) {
		if (cstCustomer.getCustName() != null && !cstCustomer.getCustName().equals("")) {
			// 拼接查询条件客户名称
			detachedCriteria.add(Restrictions.eq("custName", cstCustomer.getCustName()));
		}
	}
	return customerDao.findCustomerList(detachedCriteria, firstResult, maxResults);

}

// @Override
// public void updateCustomer(Long custId,CstCustomer cstCustomer,CstCustomerDetail cstCustomerDetail) {
// Session session = HibernateUtil.getCurrentSession();
// try {
// //开启事务
// session.beginTransaction();
// CustomerDao customerDao = new CustomerDaoImpl();
// CustomerDetailDao customerDetailDao = new CustomerDetailDaoImpl();
//
// //根据id查询客户
// CstCustomer cstCustomer_update = customerDao.findCustomerById(custId);
// cstCustomer_update.setCustName(cstCustomer.getCustName());//更新客户名称
//
// customerDao.update(cstCustomer_update);
// //根据id查询客户详细信息
// CstCustomerDetail cstCustomerDetail_update = customerDetailDao.findCustomerDetailById(custId);
// cstCustomerDetail_update.setCustAddress(cstCustomerDetail.getCustAddress());//联系地址
// customerDetailDao.update(cstCustomerDetail);
// //提交事务
// session.getTransaction().commit();
// } catch (Exception e) {
// e.printStackTrace();
// //回滚事务
// session.getTransaction().rollback();
// } finally {
// //关闭session
// HibernateUtil.closeSession();
// }
// }

// @Override
// public void deleteCustomer(Long custId) {
// Session session = HibernateUtil.getCurrentSession();
// try {
// //开启事务
// session.beginTransaction();
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“classpath:spring/applicationContext.xml”);
CustomerDao customerDao = (CustomerDao) applicationContext.getBean(“customerDao”);
CustomerDetailDao customerDetailDao = (CustomerDetailDao) applicationContext.getBean(“customerDetailDao”);
// customerDao.delete(custId);
// customerDetailDao.delete(custId);
// //提交事务
// session.getTransaction().commit();
// } catch (Exception e) {
// e.printStackTrace();
// //回滚事务
// session.getTransaction().rollback();
// } finally {
// //关闭session
// HibernateUtil.closeSession();
// }
//
// }

@Override
public CstCustomer findCustomerById(Long custId) {
	return customerDao.findCustomerById(custId);
}

// 根据主键查询客户详细信息
public CstCustomerDetail findCstCustomerDetailById(Long custId) {
	return customerDetailDao.findCustomerDetailById(custId);
}

public CustomerDao getCustomerDao() {
	return customerDao;
}

public void setCustomerDao(CustomerDao customerDao) {
	this.customerDao = customerDao;
}

public CustomerDetailDao getCustomerDetailDao() {
	return customerDetailDao;
}

public void setCustomerDetailDao(CustomerDetailDao customerDetailDao) {
	this.customerDetailDao = customerDetailDao;
}

}
`

  • service配置

  • `

     <property name="customerDao" ref="customerDao" />
     <property name="customerDetailDao" ref="customerDetailDao" />
    
`
  • 事务管理器(重点在这里)

  • `

     	<!-- 配置事务 -->
     	<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
     	<!-- 配置依赖 -->
     	<property name="sessionFactory" ref="sessionFactory"/>
     	</bean>
     	<!-- 事务增强配置 -->
     	<tx:advice id="txAdvice" transaction-manager="transactionManager">
     		<tx:attributes>
     			<tx:method name="insert*" propagation="REQUIRED" /><!-- 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中-->
     			<tx:method name="delete*" propagation="REQUIRED"/>
     			<tx:method name="update*" propagation="REQUIRED" />
     			<tx:method name="get*" propagation="SUPPORTS" read-only="true"/><!-- 支持当前事务,如果当前没有事务,就以非事务方式执行 -->
     			<tx:method name="find*" propagation="SUPPORTS" read-only="true"/><!-- read-only="true" 只读 -->
     			<tx:method name="save*" propagation="REQUIRED"/>
     		</tx:attributes>
     	</tx:advice>
     	<!-- 配置aop代理
     		aop切面
     	 -->
     	<aop:config>
     		<aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.crm.service.impl.*.*(..))"/><!-- 切入点 -->
     	</aop:config>
    
`

了解配置jdk或cglib

在aop代理配置处,可以通过proxy-target-class控制使用的代理方式:
proxy-target-class=false 默认值,使用jdk代理

<aop:config proxy-target-class=“false”>

proxy-target-class=true 使用cglib代理

<aop:config proxy-target-class=“true”>

如果此类没有实现接口,只能使用cglib代理!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值