`
fehly
  • 浏览: 248668 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

浅谈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);
	}
}

 

 

 

分享到:
评论

相关推荐

    泛型dao 泛型dao 泛型dao

    泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层实现一样。 Action : SavePersonAction直接调用PersonService。 ...

    泛型DAO模式在Java Web开发中的应用.pdf

    泛型DAO模式在Java Web开发中的应用 摘要: 泛型DAO模式是Java Web开发中的一种重要模式,它可以提高数据访问代码的类型安全性和可读性。该模式可以与Struts、Spring和JPA框架集成,实现用户管理系统的开发。通过...

    T21.13_泛型DAO模式与OSIV java 经典教程 经典教材

    T21.13_泛型DAO模式与OSIV java 经典教程 经典教材

    经典泛型dao层代码,非常好用简易

    ### 泛型DAO层在SSH框架中的应用与详解 #### 引言 在现代软件开发中,特别是基于Java的企业级应用开发中,DAO(Data Access Object)层的设计扮演着至关重要的角色。它作为业务逻辑层与数据持久层之间的桥梁,承担...

    Java Web程序运用中泛型DAO的作用.pdf

    本文探讨了在Java Web程序中应用泛型DAO模式的作用和意义。首先,文章明确了Java Web技术的定义和在互联网领域中的重要性,阐述了随着软件功能需求的不断提高,Java Web技术也在不断升级和改造。随后,文章指出泛型...

    泛型dao

    【泛型DAO】是一种在Java开发中常见的设计模式,它利用了Java泛型特性来提高代码的可重用性和类型安全性。在Java中,DAO(Data Access Object)模式是用来封装对数据库的操作,将业务逻辑与数据访问逻辑分离,使得...

    Hibernate泛型Dao

    【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...

    Hibernate泛型DAO(结合spring模板支持)

    泛型DAO是一种设计模式,它通过定义一个通用的DAO接口或抽象类,可以适用于不同的实体类,减少了重复的代码。这种模式的核心在于利用Java的泛型特性,使得DAO方法可以处理任何类型的实体对象,而无需为每个实体类...

    一个很好的通用泛型dao(含源码)

    而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...

    JdbcTemplate通用泛型Dao实现

    `JdbcTemplate`的泛型Dao实现是一种设计模式,目的是提高代码的可重用性和可维护性。通过定义一个泛型接口,我们可以创建一个通用的数据访问对象(DAO),这个DAO可以处理任何类型的实体类,只要它们遵循一定的规则...

    大家看看我设计的泛型DAO(使用Spring的Anotation和Hibernate)

    在IT行业中,数据库操作是应用程序的核心部分,而DAO(Data Access Object)模式是连接业务逻辑层与数据存储层的关键。本篇文章将深入探讨一个使用Spring注解和Hibernate实现的泛型DAO设计,以提高代码的复用性和可...

    S2SH整合例子 注解配置 JSON 泛型Dao

    6. **泛型Dao**:在Java开发中,泛型Dao(Generic Dao)是一种设计模式,用于减少重复的数据库操作代码。通过定义一个通用的Dao接口,可以实现对不同类型的实体对象进行CRUD操作,提高了代码的复用性和可维护性。...

    泛型DAO,注释详细

    泛型DAO(Generic DAO)是DAO模式的一个扩展,它引入了泛型的概念,提高了代码的复用性和类型安全性。本篇文章将深入探讨泛型DAO的实现原理、优势以及如何在实际项目中应用。 首先,我们来理解什么是泛型。泛型是...

    spring hibernate 泛型DAO

    总结起来,"Spring Hibernate 泛型DAO"的主题涵盖了Spring框架的IoC容器与Hibernate的ORM能力,通过泛型和Criteria查询,我们可以实现更加高效、可复用的DAO层代码。这样的设计使得项目结构更加清晰,减少了代码冗余...

    Java Web程序运用中泛型DAO的作用.zip

    而泛型DAO是DAO模式的一个进阶应用,它通过引入泛型来提高代码的复用性和可维护性。 泛型(Generics)是Java 5引入的一个重要特性,它可以让我们在编译时检查类型安全,并且允许我们创建参数化的类型。在泛型DAO中...

    ssh通用泛型DAO

    总的来说,"ssh通用泛型DAO"是一种设计模式,旨在简化SSH框架下的数据访问层开发,提高代码复用性,减少重复工作,同时通过泛型提供类型安全的保障。理解和熟练运用这一模式,能够有效地提升Java Web应用的开发效率...

    Hibernate泛型DAO及使用方法.doc

    而泛型DAO(Data Access Object)则是基于Hibernate进一步抽象出来的一个设计模式,用于提供更通用的数据操作方法。本文档主要探讨了如何在Spring+Hibernate环境中创建和使用泛型DAO。 首先,我们来看一下泛型DAO...

    SSH 泛型DAO分页

    4. **泛型DAO**: 在SSH框架中,泛型DAO是一种常见的设计模式,用于封装对数据库的基本操作,如增删查改。通过泛型,我们可以创建一个通用的DAO接口和实现,减少代码重复,提高代码复用。例如,我们可以创建一个`...

Global site tag (gtag.js) - Google Analytics