在进行数据访问的时候每个用户对应一个线程,而用户的各种数据的处理都是通过线程来完成的。
根据Hibernate的功能分级,在Dao(Data Access Object)数据访问对象进行基本的对象处理
例如
public class CustomerDao {
private HibernateTemplate ht = new HibernateTemplate();
/**
* insertCustomer
*/
public void insertCustomer(final Customer c){
ht.execute(new HibernateCallback() {
public Object doInHibernate(Session s) {
s.save(c);
return null;
}
});
}
/**
* insertCustomer
*/
public void updateCustomer(final Customer c){
ht.execute(new HibernateCallback() {
public Object doInHibernate(Session s) {
s.update(c);
return null;
}
});
}
public Customer getCustomer(final Integer id){
return (Customer)ht.execute(new HibernateCallback() {
public Object doInHibernate(Session s) {
return s.get(Customer.class, id);
}
});
}
public List<Customer> findAll(){
return (List<Customer>)ht.execute(new HibernateCallback() {
public Object doInHibernate(Session s) {
return s.createQuery("from Customer").list();
}
});
}
}
在DAO上边在进行SERVICE级别的处理,一般会涉及到多个DAO之间SESSION传递,为了解决同一个SERVICE上SESSION相互传递的低效率,在此采用ThreadLocal进行线程本地化技术,实现session的高效共享
实现步骤如下
1.hibernate.cfg.xml文件进行配置
<property name="hibernate.current_session_context_class">thread</property>
使其支持线程本地化技术
2.ThreadLocal的实现
private SessionFactory sf;
public void initSf(){
sf = new Configuration()
.configure()
.buildSessionFactory();
}
public void testLocalThread(){
//获得currentsession,直接开启全局事务
sf.getCurrentSession().beginTransaction();
CusomerDao customerDao = new CustomreDao();
OrderDao orderDao = new OrderDao();
Customer c =new Customer();
Order o = new Order();
o.setPrice(155);
c.addOrder(o);
customerDao.insertOne(c);
orderDao.insertOne(o);
//获得currentsession,提交全局事务
sf.getCurrentSession().getTransaction().commit();
//获得currentsession,关闭会话
sf.getCurrentSession().close();
sf.close();
}
简单写一下就是这样,大家可以根据自己的项目进行改造,实际中使用中可以再通过模板进行封装。如果大家有什么问题也可以在留言,也可以在知乎上@寸辰