多线程与hibernate openSession绑定在当前线程

先上代码:

package com.ifunpay.portal.task;

import com.alibaba.fastjson.JSON;
import com.ifunpay.portal.dao.order.OrderEntityDao;
import com.ifunpay.portal.entity.order.OrderEntity;
import com.ifunpay.portal.model.PaidInfo;
import com.ifunpay.portal.service.PaymentManageService;
import com.ifunpay.portal.service.payment.AbcAggPaymentManager;
import com.ifunpay.util.enums.BankAppEnum;
import com.ifunpay.util.enums.PaymentStatusEnum;
import lombok.extern.log4j.Log4j2;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate4.SessionFactoryUtils;
import org.springframework.orm.hibernate4.SessionHolder;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.web.servlet.ModelAndView;

import java.ut
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用hibernate编程步骤 1)配置环境,加载hibernate的jar文件,以及连接数据库连接使用的jar文件,并配置CLASSPATH环境变量。 2)写POJO类(普通的java类) 3)写hibernate所需的配置文件,hibernate.cfg.xml ,Xxxxx.hbm.xml 4)调用hibernate API。 a)使用Configuration对象的buildSessionFactory()方法创建SessionFactory对象。 b)使用SessionFactory对象openSession()方法创建Session对象。 c)使用Session的相应方法来操作数据库,将对象信息持久化到数据库。 3.Hibernate的5个核心类或接口: (1)Configuration:用于解析hibernate.cfg.xml文件和XXXXX.hbm.xml文件,并创建SessionFactory对象。Configuration对象用于配置并且启动HibernateHibernate应用通过Configuration实例来指定对象--关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。 (2)SessionFactory:初始化Hibernate,充当数据存储源的代理,创建Session对象。一个SessinFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。如果应用同时访问多个DB,怎需要为每个数据库创建一个单独的SessionFactory实例。 (3)Session:也被称为持久化管理器,对象级数据库操作。 特点: 1)不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。 2)Session实例是轻量级的,所谓轻量级,是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单位分配单独的Session实例。 3)通常将每一个Session实例和一个DB事务邦定,也就是说,每执行一个DB事务,都应该先创建一个新的Session实例,不论事务执行成功与否,最后都应该调用Session的close()方法,从而释放Session实例占用的资源。 注:每个Session实例都有自己的缓存,这个Session实例的缓存只能被当前的工作单元访问。 (4)Query:执行数据库查询操作。要使用HQL(HibernateQueryLanguage)查询语句,HQL查询语句是面向对象的,它引用类名及类的属性名。 select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc Transaction:用于管理操作事务。它对底层的事务接口做了封装,底层事务接口包括:JDBC API、JTA(JavaTransactionAPI)、CORBA(CommonObjectRequestBroker Architecture)API。
一.使用HibernateSession对象操作数据库 1.初始化Hibernate:在要使用Hibernate的类的方法中实例化Configuration对象并用Configuration对象的configure()方法将hibernate.cfg.xml中的配置加载到内存,即: Configuration config = new Configuration().configure(); //该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:SessionFactory sf = Configuration对象.buildSessionFactory();Session session = SessionFactory对象.openSession(); 注:由于SessionFactory是重量级对象,很耗资源,所以在获取SessionFactory对象时最好用单例模式获取,以确保一个应用中只有一个SessionFactory对象存在和线程安全,由于Session对象 是非线程安全的(尽管创建一个Session对象消耗的资源很小),所以在获取Session对象时候也最好用单例模式获取 3.提交并清空Session中缓存的数据后开始一个事务 Session对象.flush(); //将Session中的缓存内容提交到数据库 Session对象.clear(); //清空Session中的所有缓存(彻底清除会话) Session对象.beginTransaction().begin(); //开始一个事务 4.用Session对象的以下方法操作数据 (1).save(Object obj); (2).saveOrUpdate(Object obj); (3).delete(Object obj); //只要删除的对象设置了主键的值就可以删除而无需先获取 (4).update(Object obj); //只要更新的对象设置了主键的值就可以更新而无需先获取 (5).get(Class classes,Serializable pk); //该方法会立即加载/获取数据(只要调用该方法就会立即向数据库发出查询语句),该方法只在内部缓存查找数据,如果内部缓存中没有数据就直接去数据库查询,当数据库中没有要查询的数据时返回null (6).load(Class classes,Serializable pk); //该方法会延迟加载/获取数据(只有使用该对象中的字段时才会向数据库发出查询语句),该方法会在内部和二级缓存中查找数据,当数据库中没有要查询的数据时报ObjectNotFoundException异常 (7).createQuery(String HQL).list()/iterate()/uniqueResult(); //HQL(Hibernate Query Language)语句查询

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值