架构

浅谈OSIV与泛型DAO模式

我爱IT资讯库   2021/02/22

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

 

 

 




热门内容

数据库设计原理:数据建模的三个阶段

如果你在Google或者百度上搜索数据建模,相信可以搜索出很多关于数据建模的文章,但是你会发现其中绝大部分是理论、... ...

ajaxfileupload.js 文件上传

一,前台代码。 <input id="fileToUpload" type="... ...

ios的标志常量

1 dec 2 fixed 3 hex 4 internal 5 left 6 oct 7 right 8 scien ...

discuz删除垃圾帖子

有时候如果你的论坛被垃圾帖子占满后,会发现使用后台的删除功能还是有些慢, 我们需要先备份自己需要的帖子,然后进行下面的 ...

Hibernate的主配置文件hibernate.cfg.xml

1:hibernate的主配置文件的名字必须是hibernate.cfg.xml:   1.1:主配置文件主要分为三部分 ...

关于html base元素的使用

base元素可以用于设置页面嵌入的css文件或js文件链接的基地址。 例子: <h... ...

类型转换与强制转换

自动转换: 举一个例子:把一个小的东西放到一个大的盒子里,是件非常容易的事,不用做任何改变,在这里理解成自动转换。... ...

利用wxwidgets操纵word

最近在学习怎么用wxwidgets来操纵word,寻找之中发现MedeoSoftware,里面有很多wxwidgets的... ...

Python中的简单类型

整数 & 浮点数 整数有两种,分别是 int 和 long。其中 int 最大值是 2147483647... ...

JS-时间函数

/** * 日期范围工具类 */ var daterangeutil = (function () { /** ...
“大数据”信息平台 覆盖社区5000老年人

“大数据”信息平台 覆盖社区5000老年人

突然头疼脑热,身边没人照顾;电灯坏了、水管漏了,该找谁来帮忙修?菊园新区智慧养老项目搭建了一个为老综合服务平台... ...

在PHP中全局变量的使用详解

即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的。一些常见的全... ...

名称空间也可以自定义

名字空间的定义 名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关键字namespace,使用名字空 ...
从量价变化中洞察主力意图

从量价变化中洞察主力意图

成份B指(399003.SZ) <script language="JavaScript" typ... ...
android 继承view类刷新页面【安卓进化十一】

android 继承view类刷新页面【安卓进化十一】

       最近做项目中发现,继承了view类的子类... ...

C# XmlSerializer 对象的Xml序列化和反序列化

    .Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在... ...

hdu-1286找新朋友(欧拉函数,水题)

题目链接: 找新朋友 time limit: 2000/1000 ms (java/others)memory limi ...

java程序 处理 andrid本地帮助文档打开慢的方式

    下载本地的android自带sdk帮助文档由于有被墙的google地址,可以通... ...

RTTI学习笔记

翻看C++的书,对RTTI的讲解都很困惑,"你知道你的对象是哪个类吗","RTTI常用于调试和数据库程序"对这些讲... ...

使用axis2传输附件

服务端Service文件: import java.io.FileOutputStream; import jav... ...

sql server 的行转列

sql server中行转列在sql2005之后,sqlserver引入了pivot运算符,也即是可以旋转行为列,... ...
【Node.js基础篇】(九)使用readline模块实现Node.js的输入输出

【Node.js基础篇】(九)使用readline模块实现Node.js的输入输出

学C++的时候,有cout和cin,Java也有println和Scanner控件,Node.js也有如同... ...
iOS 应用支持4寸屏

iOS 应用支持4寸屏

iPhone 5出了,一大批应用要兼容新的分辨率,下载了Xcode 4.5,在官方那里找不到有关兼容新分辨... ...

循环执行oracle到mysql的迁移步骤及各种注意事项

改章节笔者在北京逛街的时候突然想到的...今天就有想写几篇关于循环执行的笔记,所以回家到之后就奋笔疾书的写出来发表了 ... ...
2015收获的季节

2015收获的季节

—————————————————————前言————————————————————— ———————... ...

JSP中的pageEncoding和contentType属性

关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是js... ...

对XX证券报关于物联网操作系统的几个问题的答复

XX证券报提问了几个关于物联网和物联网操作系统的问题,个人表达了一些粗陋的观点,在这里发表出来,与行业朋友交流和探... ...
In语句优化

In语句优化

In语句的优化 现有两张表: CLINIC_ORGANISM 数据量:1400 LAB_DRUGRESISTITE... ...
fuzzysearch, 在JavaScript中,快速而快速的模糊搜索

fuzzysearch, 在JavaScript中,快速而快速的模糊搜索

源代码名称:fuzzysearch源代码网址:http://www.github.com/bevacqua/fuzzys ...

SQL Server里的 ISNULL 与 NULLIF

SQL Server 中有两个参数,语法:     ISNULL(check_... ...