service层开启事务,具体代码和说明如下:
package com.itheima.service;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.itheima.dao.CustomerDao;
import com.itheima.domain.Customer;
import com.itheima.utils.HibernateUtils;
/* 对于上述的两个方法,有以下区别:
1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,
假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。
2. getCurrentSession ,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,
会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,
这就是与openSession的区别之一,简单而言,getCurrentSession
就是:如果有已经使用的,用旧的,如果没有,建新的。
注意:在实际开发中,往往使用getCurrentSession多,
因为一般是处理同一个事务(即是使用一个数据库的情况),
所以在一般情况下比较少使用openSession或者说openSession是比较老旧的一套接口了
*/
public class CustomerServicelmp implements CustomerService {
private CustomerDao dao = new CustomerDao();
private List<Customer> list= null;
@Override
public void save(Customer c) {
// TODO Auto-generated method stub
Session session = HibernateUtils.getCurrentSession();
//打开事务
Transaction tx = session.beginTransaction();
try{
//调用dao保存客户
dao.save(c);
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}
//关闭事务
tx.commit();
}
/*获取列表信息
* 关于事务的操作都在service层(重点)
*
*/
@Override
public List<Customer> getAll() {
// TODO Auto-generated method stub
//调用dao连接数据库,获取数据
//1.获取session
Session session = HibernateUtils.getCurrentSession();
//开启事务
Transaction tx = session.beginTransaction();
//操作具体业务
try {
list = dao.getAll();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
tx.rollback();
}
//提交事务
/**
* 使用getCurrentSession()方法时, 事务提交会自动close();
*
*/
tx.commit();
return list;
}
}