Hibernate学习2--对象的三种状态以及映射关系的简单配置
上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态。
一、hibernate缓存的概念
1、session与缓存的关系。在hibernate中,有时候,会把session称作一级缓存,这是因为,session所管理的java beans对象其实就相当于一个内存中数据库的一个缓存。session和bean以及缓存的概念关系图可以参考以下的图:

所以,上图大概说明了缓存区,session和bean的关系:当bean被session进行管理后,它也就被持久化了,也就相当于在缓存区中了。
而如何进行持久化,上篇hibernate的博客也都说过了,这里不详细讲。
二、hibernate中,bean的三种状态
1、状态一:临时状态。当对象刚刚被创建出来(直接new)而且没有关联任何session时,便处于这种状态。这时,它和其他的java普通对象没什么大区别,它和数据库也没有任何关联。
2、状态二:持久化状态,这时候,对象关联了数据库,处在session的托管之下,可以直接操作对象达到操作数据库的效果。上篇博客也稍微提到了持久化的方法,下面具体说说hibernate中如何对象持久化。
方法一:直接通过save (saveOrUpdate)方法:
//调用session进行对象持久化
session.save(person);
//当然也可以这样持久化:session.saveOrUpdate(person);
save和saveOrUpdate的区别:前者直接将临时的对象变为持久化化状态,后者也可以达到同样的目的,只是后者多了一层这样的含义:当对象处于临时状态时,进行save操作,当对象处于游离或者持久状态(游离状态稍后介绍)时进行update操作。
3、状态三:游离状态,当调用session的close方法或者调用delete操作时,对象会处于游离状态(假设该bean对象只有一个session托管)。游离状态的对象可以通过saveOrUpdate进行再次托管。
//当调用delete时,对象处理游离状态(就算进行了删除操作,对象还是在内存中,不会立即销毁,毕竟垃圾回收器还没有工作)
session.delete(person);//删除,会删除数据库中的数据,同时将person的托管关系和session断开,person处于游离状态
//......事务操作
session.close();//当然,如果直接关掉session,也会导致person处在游离状态
//下面可以重新托管对象person
session.saveOrUpdate(person);//这样,person又重新给托管了
显然,对象的三种状态,其实只是对象和hibernate的三种关系罢了,具体的关系参考下面的丑图进行理解:

4、获取持久化状态对象的其他方法。当在配置文件指明了数据库表和bean的映射关系时,我们可以直接通过session的get方法获取一个持久化对象,而且,该对象已经被初始化,看下面代码:
//也可以这样直接获取一个持久化对象
Person person2 = (Person) session.get(Person.class, 1);//这里通过主键获取,注意主键类型是什么就传什么类型的值
在这里,通过get方法即可获得对象的一个实例,而且该对象已经被持久化了。说到这里,我们需要注意一个问题:就是session可以管理多个对象,但是前提是这些对象的主键(在配置文件中体现)的值不可以重复,否则会出错!
三、hibernate映射关系的简单配置
前面的讨论中,我都没有说到如何建立数据库和bean的映射关系,下面简单讨论下映射配置文件的书写问题,先看以下的例子:
<hibernate-mapping>
<!-- class标签这里说明了哪个bean对应哪个数据库表 -->
<class name="DTO.AddressListDTO" table="addresslist">
<!-- id标签说明了bean的主键是什么,这里说明是对应bean里面一个id变量作为bean的主键 -->
<id name="id" type="int">
<!-- 这里column说明了bean主键对应数据库的主键是什么 -->
<column name="id"/>
<!-- 说明主键是自增 -->
<generator class="increment"/>
</id>
<!-- property说明了bean的phone变量是什么类型以及对应数据库表的那些字段 -->
<property name="phone" type="java.lang.String">
<!-- 说明了对应bean 的phone的变量所对应的数据库字段为phone字段 -->
<column name="phone" />
</property>
<property name="address" type="java.lang.String">
<column name="address" />
</property>
<property name="email" type="java.lang.String">
<column name="email" />
</property>
<property name="userId" type="java.lang.Integer">
<column name="user_id" />
</property>
</class>
</hibernate-mapping>
OK,上面的注释也大概说明了如何将bean对象映射到数据库中了,下面的配置文件就是配置hibernate和数据库的关系的配置文件了,也是Configuration().configure()所操作的配置文件(所以直接调用该方法时需要将配置文件放在src源码目录的根目录下)。
<hibernate-configuration>
<session-factory>
<!--MySQL数据库配置-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/addresslist</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property> <!-- 所有访问数据库操作的SQL都会显示,用于调试,发布时应该移除 -->
<property name="show_sql">true</property> <!-- 这里就是将上面那个bean和数据库表的映射配置文件导入操作 -->
<mapping resource="DTO/Member.hbm.xml" />
</session-factory>
</hibernate-configuration>
Hibernate学习2--对象的三种状态以及映射关系的简单配置的更多相关文章
- Hibernate中Java对象的三种状态
Hibernate中Java对象的三种 ...
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- Hibernate(六)__对象的三种状态
瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前 ...
- hibernate 实体对象的三种状态以及转换关系。
最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...
- Hibernate之对象的三种状态
Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/ar ...
- 【Java EE 学习 45】【Hibernate学习第二天】【对象的三种状态】【一对多关系的操作】
一.对象的三种状态. 1.对象有三种状态:持久化状态.临时状态.脱管状态(游离状态) 2.Session的特定方法能使得一个对象从一个状态转换到另外一个状态. 3.三种状态的说明 (1)临时状态:临时 ...
- HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口
1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...
- hibernate对象的三种状态
对于hibernate,我想不在这里讲解了,我们就直接进入主题 在这里我将要说的是"hibernate对象的三种状态",对象是我们十分熟悉的,对吧!而对于对象它有三种状态 分别是瞬 ...
- Hibernate 对象的三种状态
hibernate对象的三种状态: (一) 瞬时(临时)状态: 对象被创建时的状态,数据库里面没有与之对应的记录! (二) 持久状态: 处于session的管理中,并且数据库里面存在与之对应的 ...
随机推荐
- $().click()和$().on('click',function(){})的区别
1. $(选择器).click(fn) 当选中的选择器被点击时触发回调函数fn.只针对与页面已存在的选择器. HTML代码: <!DOCTYPE html> <html lang=& ...
- [agc004d]Teleporter 暴力
Description 维尼管辖的领土很大,我们可以抽象为n个城市,其中1号点为首都.这n个城市之有n条单向电缆,一条信息经过一条电缆进行传输所需时间会+1s,然而维尼并不能忍受时间白白被续,他要求从 ...
- NSUserDefault存储类
类要实现NSCoding协议 实现encodeWithCoder和initWithCoder方法 先把类的instance archive成NSData,然后存起来 TGTest *tt = [TGT ...
- typescript项目中import 图片时报错:TS2307: Cannot find module ‘...’
最近在用typescript写项目时,我用import来加载一个图片,webpack编译文件是会报错如下: 报错: 解决: 如果在js中引入本地静态资源图片时使用import img from './ ...
- C#-函数的传值与传址
传值就是将实参的值传到所调用的函数里面,实参的值并没有发生变化,默认传值的有int型,浮点型,bool型,char字符型,结构体等等. 传址就是将地址传到所调用的函数里面操作,实参的值也会跟着变化,传 ...
- DEM反应添加顺序注意问题
在含有DEM反应的dat中,均相反应的block要在DEM反应之前,例如: @(RXNS) (some reaction equations) @(END) @(DES_RXNS) (some rea ...
- C#集合之集(set)
包含不重复元素的集合称为“集(set)”..NET Framework包含两个集HashSet<T>和SortedSet<T>,它们都实现ISet<T>接口.Has ...
- 2019年华南理工大学程序设计竞赛(春季赛) B 修仙时在做什么?有没有空?可以来炼丹吗?(思维建图搜索)
https://ac.nowcoder.com/acm/contest/625/B 分析: 全部的状态只有1<<18 个 , 所以我们可以预处理 f[u][j] , 然后建立出全部的u可以 ...
- php尝试调用一个图灵机器人
1.需要到图灵机器人的网址,去注册一下账号.网址:http://www.tuling123.com/sso-web/index.html?ReturnURL=http%3A%2F%2Fwww.tuli ...
- 微信 vue中使用video.js播放m3u8视频,解决安卓自动全屏的问题。
最近一个项目中需要在微信中播放m3u8格式的视频,刚开始用了 vue-video-player 这个插件,在IOS手机体验良好,本以为完事了, 结果安卓手机一点播放就自动全屏,心态略崩.查了资料说是安 ...