修改HibernateSessionFactory文件(这个文件是由Hibernate帮我们自己动完成的):
加上如下内容:
private static final ThreadLocal trthreadLocal = new ThreadLocal();//事务线程
/**
* 打开事务
*/
public static void OpenTransaction(){
Transaction tran=(Transaction) trthreadLocal.get();
if(tran==null){
tran=getSession().beginTransaction();
trthreadLocal.set(tran);
}
}
/**
* 提交事务
*/
public static void CommitTransaction(){
Transaction tran=(Transaction) trthreadLocal.get();
if(tran!=null && !tran.wasCommitted() && !tran.wasRolledBack()){
tran.commit();
trthreadLocal.set(null);
}
}
/**
* 回滚事务
*/
public static void RollbackTransaction(){
Transaction tran=(Transaction) trthreadLocal.get();
if(tran!=null && !tran.wasCommitted() && !tran.wasRolledBack()){
tran.rollback();
trthreadLocal.set(null);
}
}
新建一个开启与关闭Session与Transaction的Filter
public class SessionTransactionFilter extends HttpServlet implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
try {
HibernateSessionFactory.getSession();//打开session
HibernateSessionFactory.OpenTransaction();//打开事务
arg2.doFilter(arg0, arg1);
HibernateSessionFactory.CommitTransaction();//事务提交
} catch (Exception e) {
HibernateSessionFactory.RollbackTransaction();//回滚事务
e.printStackTrace();
}finally{
HibernateSessionFactory.closeSession();//关闭session
}
}
}
在我们的DAO中就可以不用管我们的Session与Transaction了
1, 共公接口
public interface CommonDAO {
public void save(Object obj);
public void delete(Object obj);
public void update(Object obj);
}
2, 共公方法
public class CommonDAOImple implements CommonDAO{
public Session GetSession(){
return HibernateSessionFactory.getSession();
}
public void delete(Object obj) {
this.GetSession().delete(obj);
}
public void save(Object obj) {
this.GetSession().save(obj);
}
public void update(Object obj) {
this.GetSession().update(obj);
}
}
3, 具体的某一个城对象的interface如下:
public interface FlDAO extends CommonDAO {
public TFl getone(int id);
public List getall();
public void delete(int id);
}
4, 具体的某一个城对象的DAO如下:
public class FlDAOImple extends CommonDAOImple implements FlDAO {
public List getall() {
Query query=this.GetSession().createQuery("from TFl");
return query.list();
}
public TFl getone(int id) {
return (TFl) this.GetSession().get(TFl.class, new Integer(id));
}
public void delete(int id) {
Query query=this.GetSession().createQuery("delete TFl where FId=:id");
query.setInteger("id", id);
query.executeUpdate();
}
}
5, 个人说明:
这样的做法可以解决Hibernate中的懒加载问题和每个方法中的Session开启与关闭,Transaction的开启与关闭。但是它带来的问题也是很大的
1, Session的开启在客户端请求时打开,请求完全结束时关闭,这样Session的开启时间太长,而Session中是非线程安全的。并且一个Session保持与数据库一个连接,长时间的占用了数据库的资源。
2, Transaction的开启时间在Session之后一点,关闭时间在Session之前一点,同样也开了很长的时间,这段时间内可能导致数据库里的数据库产生锁,别的线程没法操作数据。
相关推荐
可以对hibernate的 Session 和 Transaction 有更深入的认识 希望对一些概念比较模糊的人 有帮助
NULL 博文链接:https://stewchicken.iteye.com/blog/938875
spring-hibernate-maven-transaction整合
Could not roll back Hibernate transaction.doc
第24次课-1 Spring与Hibernate的整合 本节主要内容 24.1 概述 24.2 管理SessionFactory 24.3 Spring对Hibernate的简化 24.1 概述 24.1.1 概述 Spring提供了很多IoC特性的支持,方便处理大部分典型的Hibernate整合...
hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...
spring 3.2.0+hibernate 4.1.6+struts2整合需要的jar包 的目录 antlr-2.7.7.jar aopalliance-1.0.jar asm-3.3.jar asm-commons-3.3.jar aspectjweaver-1.5.3.jar bonecp-0.7.1.RELEASE.jar cglib-2.1.3.jar ...
介绍Hibernate+Transaction+myeclipse6+事例的应用参考工程源码.
delete()方法用于从数据库中删除与Java对象对应的记录。如果传入的参数是持久化对象,Session就计划执行一个delete语句。如果传入的参数是游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一...
压缩文件中不包含Jar文件(由于全部的Jar将近12M,不能全部上传),所用到的Jar目录为,工程中再也不会出现由于MyEclipse自动整合而出现的大量Jar文件 : Java代码 1. //如果不用,启动时不会出错,但使用Dwr时,会...
这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。 SessionFactory接口 SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建...
11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管...
//该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...
1.1.24-20120814.043343-7.jar freemarker-2.3.19.jar hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.2.1.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar hibernate-validator-5.1.0.Final....
(2)将Hibernate所需的JAR包复制到WEB-INF/lib下。 (3)创建Hibernate的配置文件。 (4)利用Hibernate的第三方工具或Eclipse的有关插件从数据库中创建出相应的实体对象及其ORM映射文件。 (5)创建Hibernate的...
D:\spring 3.2.0+hibernate 4.1.6+struts2整合需要的jar包 的目录 2013/05/11 15:26 <DIR> . 2013/05/11 15:26 <DIR> .. 2013/03/21 18:20 445,288 antlr-2.7.7.jar 2013/03/21 18:20 4,467 aopalliance-1.0.jar ...
在准备整合Spring之前,也在网上看了各种配置。但是楼主心里还是很纠结,...楼主还是一步一步的来吧,感觉Spring操作Hibernate还是离不开DataSource,SessionFactory,Transaction这几个要素。 详细说明看我的博客文章。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java...Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。
SSI(Struts2 + Spring + IBatis)框架集成。
Hibernate稳定版(hibernate-release-5.2.18.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。