浅谈OSIV与泛型DAO模式

open session in view  简称 OSIV 模式

在Hibernate中能更好的应用Hibernate的性能,会在Hibernate中使用延迟加载的性能,在读取一个持久化对象的时候,可能这个对象会关联到另一个对象,使用延迟加载之后,读取持久化对象,而那些所被关联的持久化对象,如果当时不需要被读取,这些所被关联的持久化对象时不会被读取的,只有能到这些被关联的持久化对象,在需要读取的时候再去通过session对象来对底层的数据库进行读取,利用这些延迟加载,可以提高Hibernate的性能,但是也会带来一些问题,容易引出一些违例

例如

 Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no session

解决上述问题有2个思路

1.在Hibernate当中延迟加载给禁止,但性能会造成较大的损失

2.延长session的生命周期,把所有要读取的数据都读取完毕后(包括持久化对象所关联的数据)在关闭session.

 

//假设以下代码在控制层执行
Session session =HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Testbook tb =(Testbook)session.load(Testbook.class,new Integer(1));
//....
//..接着,以下代码在表示层执行
System.out.println(tb.getEmail());
System.out.println(tb.getTitle());

tx.commit();//在所有事情都做完后再关闭session

 

使用Servlet过滤器实现OSIV模式

当用户向一个jsp页面或者servlet发出请求的时候开启session对象,在jsp页面或者servlet执行之后再关闭session对象。

泛型DAO模式

使用dao设计模式可以实现不同持久化框架的切换,使用泛型可以编写一个泛型的dao接口,一个泛型的dao接口的实现类

在这个接口和实现类,把通用的接口和实现类都实现后,在把具体的dao接口和实现类,不用重复的去定义这些crud的基本方法 crud: Create(创建)、Read(读取)、Update(更新)和Delete(删除)直接继承泛型的dao接口,继承泛型的dao接口的实现类

demo:

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T,PK extends Serializable> {
	public T findById(PK id);

	public List<T> findAll();

	public T save(T entity);

	public void update(T entity);

	public void delete(T entity);
}

 

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

import com.v512.guestbook.dao.GenericDao;
import com.v512.util.HibernateSessionFactoryUtil;

public abstract class GenericDaoHibernate<T, PK extends Serializable> implements GenericDao<T, PK> {
	private Class<T> clazz;

	public GenericDaoHibernate() {
		clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
				.getActualTypeArguments()[0];
	}

	public T findById(PK id) {
		Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
		return (T) session.get(clazz, id);
	}

	public List<T> findAll() {
		Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
		Query query = session.createQuery("from " + clazz.getName());
		return query.list();
	}

	public T save(T entity) {
		Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
		session.save(entity);
		return entity;
	}

	public void update(T entity) {
		Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
		session.update(entity);
	}

	public void delete(T entity) {
		Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
		session.delete(entity);
	}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值