HibernateTemplate的一些常用方法总结

1:get/load存取单条数据
public Teacher getTeacherById(Long id) {
return (Teacher)this.hibernateTemplate.get(Teacher.class, id);
}

public Teacher getTeacherById(Long id) {
return (Teacher)this.hibernateTemplate.load(Teacher.class, id);
}

2:find/iterate查询操作
public Iterator getTeachersByAge(int age) {
Iterator iterator = null;

//使用find方法
List list = (List)this.hibernateTemplate().find("from Teacher t where t.age>?", new Integer(age));
iterator = list.iterator();

//使用iterator方法
iterator = this.hibernateTemplate().iterate("from Teacher t where t.age>?", new Integer(age));

return iterator;
}

find和iterato的区别主要是iterate采用了N+1次查询,对于大批量查询,比如查询10000条记录,那么iterate就要执行10000+1次查询,find和iterate应根据具体的实际
情况来使用,对于频繁的写操作对象,应使用find查询,而对于一些只读的数据对象,应使用iterate操作,因为iterate操作使用了Hibernate的缓存机制
3:save/update/saveOrUpdate/delete 保存/更新/删除操作

public void save(Teacher teacher) {
this.hibernateTemplate.save(teacher);
}

public void update(Teacher teacher) {
this.hibernateTemplate.update(teacher);
}


public void update(Teacher teacher) {
this.hibernateTemplate.saveOrUpdate(teacher);
}



public void update(Teacher teacher) {
this.hibernateTemplate.delete(teacher);
}

4:bulkUpdate批量删除或者更新
bulkUpdate提供了批量删除和更新,直接转换为相应的update/delete SQL进行批量删除和更新
public void batchDelete(String name, int age) {
this.hibernateTemplate.bulkUpdate("delete Teacher where name=? and age = ?", new Object[]{name, age});
}


public void batchDelete(String name, String newName) {
this.hibernateTemplate.bulkUpdate("update Teacher set name=? where name=?", new Object[]{newName, name});
}
此时要注意的一个问题是,使用bulkUpdate操作,必须手工清除相关对象在Hibernate中的缓存(包括一级缓存和二级缓存)

5:execute核心方法
public Object execute(HibernateCallBack action, boolean exposeNativeSession) throws DataAccessException {
//获取一个Session
Session session = getSession();
//当前session是否在事务中
boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory());
FlushMode previousFlushMode = null;

try {
previousFlushMode = applyFlushMode(session, existingTransaction); //应用flush模式
enableFilters(session);

//暴露给action的session
Session sessionToExpose = (exposeNativeSession? session: createSessionProxy(session));
//执行action
Object result = action.doInHibernate(sessionToExpose);
flushIfNecessary(session, existingTransaction);

return result;

} catch(HibernateException ex) {
throw convertHibernateAccessException(ex);
} catch(SQLException ex) {
throw convertJdbcAccessException(ex);
} catch(RuntimeException ex) {
throw ex;
} finally {
//如果session在事务中,则不关闭session
if(existingTransaction) {
disableFilters(session);
if(previousFlushMode != null) {
session.setFlushMode(previousFlushMode);
}
} else {
//释放session
SessionFactoryUtils.releaseSession(session, getSessionFactory());
}
}
}
*HibernateCallBack,一般用来实现特定的业务逻辑

*exposeNativeSession:是一个布尔值,要暴露给HibernateCallBack实际的session对象,而不是一个代理过的对象

6:一般情况下,只有HIberateTemplate提供的方法不能满足要求时才使用execute方法,它的使用情况如下所示,
public void createDatabaseSchema() throws DataAccessException {
HibernateTemplate hibernateTemplate = new HibernateTemplate(this.sessionFactory);
//调用HibernateTempalte的execute方法
hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException { //实现HibernateCallback的doInHibernate方法
//具体实现
Connection conn = session.connection();
final Dialect dialect = Dialect.getDialect(configuration.getProperties);
String[] sql = configuration.generateSchemaCreationScript(dialect);
executeSchemaScript(conn, sql);
}
});
}
使用execute方法的重点是实现HibernateCallback的doInHibernate方法,它会传递一个Session实例,可以使用此Session实例操作数据库,由此看出execute方法的好处是应用程序不用关心session的创建和释放,只需要处理关心的业务逻辑即可

转载于:https://www.cnblogs.com/cyy-13/p/5852200.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决SVN提交代码时的错误:“Could not execute PROPPATCH”

今天在提交代码的时候,SVN报出了一个错误(斜体黑字部分): 提交失败(细节如下): 至少有一个属性变更失败;版本库未改变 设置属性 “log” 出错: Could not execute PROPPATCH. 最初,在我Google了一些信…

Python序列之元组

系列文章目录 Python序列之列表 Python序列之元组 系列文章目录前言一、元组是什么?二、元组操作1.元组的创建(1)通过()创建。小括号可以省略。(2)通过tuple()函数创建。(3)通过生成器推导式创…

Eclipse 下载 开源项目 maven依赖丢失和 Deployment Assembly 丢失

周末下载了最新的jeecg的源码来瞅瞅,但是下载后发现,pom文件中定义的依赖都丢失了。 如下图 上网搜索了一下啊,发现需要先给这个项目这个项目 disable maven nature 然后再添加上再给这个项目添加maven支持。 如下图: 然后再查看项…

windows隐藏python运行时的终端

From: https://my.oschina.net/sanpeterguo/blog/337263 摘要: windows上如果想执行一些常驻进程,使用python需要打开终端,容易误操作关掉。本文介绍一种在后台启动的解决方法,其实核心功能很简单,使用 start pythonw xxx.py 进行…

HTML CSS样式表布局

一、position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口。 示例: 二、position:absolute 1.外层没有position:absolute(或relative)&#xff…

css设置line-height无效,为什么设置span的line-height属性无效?

对于块级元素,CSS属性line-height指定了元素内部line-boxes的最小高度。 对于非替代行内元素,line-height用于计算line box的高度。 加上 display: block; 或者 display: inline-block;是行内元素,用line-heigh需要把变成块状元素用。

SVN服务器搭建和使用(一)

2019独角兽企业重金招聘Python工程师标准>>> Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 感谢原文博主:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html 首先来下载和搭建SVN服务器. 现在Subver…

C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

From: http://www.jb51.net/article/82795.htm 这篇文章主要介绍了C#使用Protocol Buffer(ProtoBuf)进行Unity的Socket通信的实例,Protocol Buffer是Google开发的数据格式,也是除了XML和JSON之外人气第三高的^^需要的朋友可以参考下首先来说一下本文中例子所要实现的功能&#…

监听el-table滚动到底;vue自定义指令监听el-table的滚动事件

链接地址:监听el-table滚动到底;vue自定义指令监听el-table的滚动事件

泛型通用函数的一些特殊问题的解决方法

首先先感谢MSDN中的一些优秀的外国友人精彩的回答,我从那里也受益良多,写此博文。 自从2.0版本的net framework推出之后泛型(Generic)得到了广泛好评。它不必像object类型一样性能上因为“拆箱”或者“装箱”得到损失,…

Go-json 实例

环境: Win7_x64 go1.6.2 package mainimport "encoding/json" import "fmt" import "os"// 我们使用两个结构体来演示自定义数据类型的JSON数据编码和解码。 type Response1 struct {Page intFruits []string } type Response2 struct {Pag…

将文件流blob或文件file读取成url

let url URL.createObjectURL(file.raw) //将文件转化成url//或者let url URL.createObjectURL(blob) //将文件流转化成url 注意这个blob一般是通过读取后端接口文件流 设置 responseType: blob 然后返回得到的blob

20145228 《信息安全系统设计基础》第0周学习总结

阅读博客感想 •经过上学期几个月的JAVA学习,收获的不仅仅是JAVA知识,更多的是我们自学一门课程的方法和能力。学习知识也不是死学,勤动手,多练习才是至关重要的。 •当处于健身教练和健身员的师生关系时,才是学习效率…

解决vue-pdf报错TypeError: Cannot read properties of undefined (reading ‘catch‘)

使用vue-pdf插件后,报错 解决方法:找到node_modules/vue-pdf/src/pdfjsWrapper.js文件,注释掉下面的代码

go 线程同步

代码来源于《Go语言开发教程》 // 线程同步: sync.Mutexpackage mainimport ("errors""fmt""sync" )type MyMap struct {mp map[string]intmutex *sync.Mutex }func (this *MyMap) Get(key string) (int, error) {this.mutex.Lock()i, ok : t…

中小企业如何提高售前,售中,售后客服质量?

企业产品出现差评、售后、维权、退款等售后问题总是让客服人员头疼,而且这些差评对企业的影响却日益重要,但是任何事情都是把双刃剑,处理好这些售后问题,不但会提升客户满意度,还会在这些售后问题中,总结出…

XMLHttpRequest 的 responseType 属性详解

XMLHttpRequest.responseType 属性是一个枚举类型的属性,返回响应数据的类型。它允许我们手动的设置返回数据的类型。如果我们将它设置为一个空字符串,它将使用默认的"text"类型。 当将responseType设置为一个特定的类型时,你需要确…

go 打印当前时间

go打印当前时间,Format好奇葩! // 打印当前时间package mainimport ("fmt""time" )func main() {fmt.Println(time.Now().Format("2006-01-02 15:04:05")) }运行结果: E:\program\go\src\hw>go run h1.go 2…

electron打包

1、全局安装electron-packager npm install -g electron-packager 2、在项目目录下执行命令 electron-packager ./ --platformwin32 --archia32--platform 是发布平台win32指windows平台 linux darwin--archia32 指32位windows 64位的则为x64 3 notice package.json里面的name字…

WPR-007:WPF中窗体的透明设置

一般使用WindowStyle,Background,AllowsTransparency,Opacity来进行设置。 1、设置Opacity控制整个窗口的透明,包括上面的控件 Window x:Class"TestTransparentWindow.MainWindow" xmlns"http://schemas.m…