【JAVA笔记——道】Hibernate 线程本地化基础篇

来源:互联网 发布:grid.base.js 编辑:程序博客网 时间:2024/04/30 15:45

在进行数据访问的时候每个用户对应一个线程,而用户的各种数据的处理都是通过线程来完成的。


根据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();
}

简单写一下就是这样,大家可以根据自己的项目进行改造,实际中使用中可以再通过模板进行封装。如果大家有什么问题也可以在留言,也可以在知乎上@寸辰

0 0
原创粉丝点击