HibernateTemplate的原理与hibernate三态

2024-02-16 23:48

本文主要是介绍HibernateTemplate的原理与hibernate三态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于HibernateTemplate的原理与JdbcTemplate的原理类似,现在先讨论JdbcTemplate,在使用JDBC的时候,总是要处理繁琐的细节,例如Connectionstatement的获得,SQLException的处理,ConnectionStatement的关闭等问题。

使用Spring提供的org.springframework.jdbc.core.JdbcTemplate类被设计成线程安全,当中提供的一些操作方法封装了类似以上的流程。

要建立JdbcTemplate的实例就必须有一个DataSource对象:

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

可使用Spring的依赖注入方式。来代替自己实例化。

刚刚看见一个例子,是这样的:

抽象类A中用到HibernateTemplate,一个类B继承了它,然后bean中是这样定义的,将HibernateTemplate直接注入到了子类B中,父类A一样可以使用HibernateTemplate

超类是被继承的类,即父类。

getGenericSuperclass()getActualTypeArguments()基本用法

import java.lang.reflect.ParameterizedType;

public class TT extends TT2<Integer> {

public static void main(String[] args) {
System.out.println(((ParameterizedType)newTT().

getClass().getGenericSuperclass()).getActualTypeArguments()[0]);

}

}

//outputclass java.lang.Integer

说明: getGenericSuperclass() 通过反射获取当前类表示的实体(类,接口,基本类型或void)的直接父类的TypegetActualTypeArguments()返回参数数组。

这样就可以利用它们将DAO做成泛型类。然后将其与HibernateTemplate一起使用,来获取对象,如:

entityClass=(ParameterizedType)newTT().getClass().getGenericSuperclass()).getActualTypeArguments()[0]);

Object entity = this.hibernateTemplate.get(entityClassid);

弄懂几个概念:临时状态、持久状态、游离状态、脱管状态。

临时状态:又被称为瞬时状态,java中很普遍,new了一个对象,这个对象不与Session实例相关联。

持久状态:

持久的实例在数据库中都有对应的记录,并且还有持久化标识。

持久状态都会与SessionTransaction相关联。Session不会将数据给提交到数据库,而是继续持久着,等待Transaction执行commit方法来提交数据。持久化对象才会与数据库同步,持久化对象就被称为脏对象。

将临时状态转化为持久化状态:

1.Session save这个瞬时对象,使其持久化。

2.使用 find(),get(),load() 和 iterater() 待方法查询到的数据对象,将成为持久化对象。

游离状态:

持久化对象脱离了Session的对象,如被Session缓存清空过的对象,还是有对象的。

脱管状态:

本质上和游离状态差不多,只是比瞬时对象多了一个数据库记录标识值 id.Session相关联,后session关闭,对象仍然可以继续改变。

持久化对象变成脱管对象:当执行 close() 或 clear(),evict() 之后,持久对象会变为脱管对象。

游离对象变成脱管对象:

 A.调用persist(),实体从游离转变到托管,最后变成持久化状态
  B.调用find()Query执行查询,实体从持久变成托管.
  C.调用refresh(),游离实体将被重新加载,变成托管状态.
  D.调用merge(),将游离实体变成托管实体.

讨论

一.Session.save(user)运行机理;

1.把User对象加入缓存中,成为持久化对象。

2.选用映射文件指定的标识生成ID

3.在Session清理缓存时执行:在底层生成insert语句,将对象存入数据库中。

如果在session.save()过程中,更改了User的属性,那么最终还是按照最终更改的来算,特别注意的是ID不能被修改。

二.Session.delete(user)

如果user是持久化对象,那么在session清理缓存的时候在底层执行delete操作。

如果user是游离态对象,那么先将usersession关联起来,最后按照user是持久化对象进行操作。

Saveupdate的区别:

Save是存储一个新的对象。

Update是把一个脱管对象或临时对象更新到数据库中。

Updatemerge的区别:

session中存在相同持久化标识的对象,用户给出的对象覆盖session已有的持久实例。

1.update会抛出异常。

2.使用merge的时候会将新生成的临时对象的属性复制到session已有的持久对象中,执行后临时对象依然是临时对象,持久化对象依然是持久化对象。

根据上面来试着解决下面的问题:

代码1_save

[java]

super.getHibernateTemplate().save(user);  

         System.out.println(""+user.getId());  

输出1

[java]

Hibernate: insert into user (userid, userpwd, userques, userans, usermail, integral, grade, sex, realname) values (?, ?, ?, ?, ?, ?, ?, ?, ?)  

9  


代码2_merge

[java]

super.getHibernateTemplate().merge(user);  

         System.out.println(""+user.getId());  

输出2

[java]

Hibernate: insert into user (userid, userpwd, userques, userans, usermail, integral, grade, sex, realname) values (?, ?, ?, ?, ?, ?, ?, ?, ?)  

0  


代码3_merge: 

[java]

user = (User)super.getHibernateTemplate().merge(user);  

         System.out.println(""+user.getId());  


输出3: 

[java]

Hibernate: insert into user (userid, userpwd, userques, userans, usermail, integral, grade, sex, realname) values (?, ?, ?, ?, ?, ?, ?, ?, ?)  

11  

为什么这几次的输入相差会这么大?

第一次使用了save,那么就会生成一个持久化对象。输出9,正常。

第二次使用了merge后,id0了。使用merge的时候会将新生成的临时对象的属性复制到session已有的持久对象中,执行后临时对象依然是临时对象。所以这个时候为0.而第三次使用了merge,是这样使用的:user = (User)super.getHibernateTemplate().merge(user); 

这时,访问user.id那么访问的是那个持久化对象的id,而不是上一步那样访问的是临时对象的id

这篇关于HibernateTemplate的原理与hibernate三态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/716046

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI