这几天使用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/
 » 如果喜欢可以:点此邮件订阅或者点此阅读器订阅