这几天使用Hibernate用的都是对HibernateSessionFacotry再次简单封装后的抽象类,前面两次出现的问题也都是出现在这个封装后的抽象类中。而我分析的时候没有给出这个抽象类的源码,以至于有些人可能看不明白。今天把这个封装后的完整代码贴出来,同时回答一下访客水漾的留言。
首先看看这位署名为水漾的朋友的留言。
看了你1月7号写的hibernate执行update()抛异常 有几个问题。
1:你从UserInfo表里查询出结果通过JSP显示,然后修改address之后你是把数据重新保存的还是覆盖从DB里拿出来的数据??
如果是覆盖的话,在映射文件的类标签上加上 dynamic-update="true"可以提高效率。
2:在hibernate里事务的commit()或者rollback()不是都会关闭session吗?需要自己手动关闭吗?
答复:
1.是重新保存到一个对象中,并非覆盖之前的。dynamic-update="true"这个属性我还没用过,多谢指教,我又学到点东西,嘿嘿。
2.Hibernate有时会自动关闭,有时不会。而我习惯上喜欢自己手工显示的将其关闭。从哪拿来的,用完就放到哪去,这是个好习惯,自夸一下,O(∩_∩)O哈哈~。
最后给出完整的代码。
package cn.ineeke.hibernate.dao; import java.io.Serializable; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; /** * 进一步封装HibernateSessionFacotry,减少代码书写量,提高效率。 */ public abstract class BaseHibernateDAO { private Session session = null; public Session getSession() { this.session = HibernateSessionFactory.getSession(); return session; } public void setSession(Session session) { this.session = session; } public void closeSession(){ this.session = null; HibernateSessionFactory.closeSession(); } public Object get(Class clz,Serializable id){ Object obj = null; Session session = this.getSession(); try { obj = session.get(clz, id); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); } return obj; } public void save(Object item){ Session session = this.getSession(); Transaction ts = null; try { ts = session.beginTransaction(); session.save(item); ts.commit(); } catch (HibernateException e) { // TODO Auto-generated catch block if(ts != null){ ts.rollback(); } e.printStackTrace(); } finally{ this.closeSession(); } } public void update(Object item){ Session session = this.getSession(); Transaction ts = null; try { ts = session.beginTransaction(); session.clear(); session.update(item); ts.commit(); } catch (HibernateException e) { // TODO Auto-generated catch block if(ts != null){ ts.rollback(); } e.printStackTrace(); } finally{ this.closeSession(); } } public void delete(Class clz,Serializable id){ Session session = this.getSession(); Transaction ts = null; try { ts = session.beginTransaction(); session.delete(this.get(clz, id)); ts.commit(); } catch (HibernateException e) { // TODO Auto-generated catch block if(ts != null){ ts.rollback(); } e.printStackTrace(); } finally{ this.closeSession(); } } }
这样一来我的DAO层具体实现类只需继承自该抽象类并实现相应的接口,具体的数据操作只需使用super.get()这样的方式即可,省了很多获取session,开启事物等操作。
» 除非另有声明,本站文章均为原创。
» 转载原创文章请以链接形式注明:
» 转载自:[Neeke] » [进一步封装HibernateSessionFacotry]
» 本文链接地址: http://www.ineeke.com/archives/828/
» 如果喜欢可以:点此邮件订阅或者点此阅读器订阅
先说:dynamic-update="true"。
这个是类标签里定义的,它的意思是只更新改变的列。这样的话更改数据库的数据的时候效率比较高。
再说下代码:
HibernateSessionFactory这应该是一个工具类吧,这个类里的getSession();方法获得的session是通过.openSession()还是getCurrentSession()还是用threadLocal管理的seesion?
dao层好象不应该控制事务,事务应该是留在BIZ层调用DAO层方法的时候控制的。
再说下dao biz view这3个层的
根据数据的传入数据库和传出数据库来分析。
传入:
1,view—>biz view输入 零散数据 然后传给biz层
2,biz—>dao biz接收到view传入的零散数据然后封装成对象然后传给dao层
3,dao层接到对象进行操作
传出:
1,db—>dao db传给dao肯定是零散数据,然后dao封装成对象。
2,dao—>biz 因为java最喜欢是对象,所以dao传给biz的最好也是对象。
3,biz 操作对象
另外附上我的工具代码:
package hibernateUtil;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sf=new Configuration()
.configure().buildSessionFactory();
public static Session getSession(){
return sf.getCurrentSession();
}
public static void release(){
sf.close();
}
public static Transaction beginTransaction(){
return getSession().beginTransaction();
}
}
HibernateSessionFactory您都知道这个是工具类,是MyEclipse自动生成的,您还要问我此类的getSession()是怎么获得的…您就不能自己打开那个类看一下么?
不知道是您故意考我还是怎么的?
最后,感谢您将dao、biz、view给俺讲的那么详细,受教了。
我没用过MyEclipse自动生成过工具类,能告诉我怎么做吗?谢谢