Hibernate-----5、持久化对象

一、持久化类的要求

提供一个无参构造器:Hibernate可使用Constructor.newInstance()来创建持久化类的实例

提供一个标识属性:标识属性通常映射数据库表的主键字段(建议使用基本类型的包装类型作为标识属性的类型)尽量避免使用基本数据类型

为持久化类的每个属性提供setter、getter方法

使用非final的类

重写equlas、hashCode方法:如需把持久化类的实例放入Set中

二、持久化对象的状态

瞬态:对象由new创建,且尚未与Hibernate Session关联的对象;瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识

持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识(identifier); 持久化对象必须与指定的Hibernate Session关联

托管:某个实例曾处于持久化状态,但随着与之关联的Session被关闭,该对象就变成托管状态;托管对象的引用依然有效,对象可继续被修改

三、改变持久化对象状态

瞬态---》持久化状态(Session的方法):

Serializable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库

Serializable save(Ojbect obj,Object pk):将obj对象保存到数据库并指定主键值

void persist(Object obj):将obj对象转化为持久化状态,该对象的属性将被保存到数据库

void persist(Object obj,Object pk):将obj对象保存到数据库并指定主键值

save方法会立即将持久化对象对应的数据插入数据库;

persist方法不会立即转换成insert语句,保证当它在一个事物外部被调用

当把一个瞬态实体变成持久化状态时,Hibernate会在底层对应的生成一条insert语句把实体对应的数据记录插入数据表

load()加载一个持久化实例,根据持久化类的标识属性值加载持久化实例(根据主键从数据表中加载一条新记录):

get()加载一个持久化实例(根据主键装载持久化实例)

News n = session.load(News.class , new Integer(pk));

pk:加载的持久化实例的标识属性

load():不会立即访问数据库;如无对应的记录,可能抛出HibernateException异常;若在类映射文件中指定了延迟加载,则返回一个未初始化的代理对象(可理解为持久化对象的替身),该代理对象并没有装载数据记录,直到程序调用该代理对象的某方法时,Hibernate才会去访问数据库;具有延迟加载功能

get(): 立即访问数据库;若无对应的记录,则返回null;

执行load、get方法加载实体时,Hibernate会在底层对应的生成一条select语句,这条select语句带有“where<主键列>=<标识属性值>”子句;都是根据主键加载持久化实例

托管状态---》持久化状态:

当修改托管对象的状态后,应用新的Session来保存这些修改,可通过update()、merge()、updateOrSave()来保存:

Student student = firstSess.load(Student.class,new Integer(20));
firstSess.close();              // 第一个Session已关闭
Student.setTitle(“新标题”);   // 修改托管状态下的持久化对象

Session secondSess = ...         // 打开第二个Session
secondSess.update(student);      // 保存托管对象所做的修改

当使用update来保存对持久化对象所做的修改时,如果不清楚该对象是否曾经持久化过,可用updateOrSave()方法

merge方法也可将托管对象所做的修改保存到数据库,merge与update方法最大的区别:merge方法不会持久化给定对象(当执行sess.update(a)后,a对象将会变成持久化状态;而执行sess.merge(a)后,a对象依然不是持久化状态,a对象依然不会被关联到Session上)

修改持久化实例:

Studentstudent = (Student) session.load(Student.class, newInteger(22));
student.setName("HHH");
session.flush();

删除持久化实例:

Studentstudent = Session.load(Student.class,new Integer(PK));
Session.delete(student);
时间: 2024-10-08 13:35:37

Hibernate-----5、持久化对象的相关文章

hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象: 2,  持久化状态(Persistent):与session关联而且在数据库中有对应数据.已经持久化,添?到了Session缓存中.如通过hibernate语句保存的对象.处于此状态的对象叫持久对象: 3,  游离状态(Detached):持久化对象脱离了Session的对象.如Session缓

hibernate载入持久化对象的两种方式——get、load

一.get与load对照 在hibernate中get和load方法是依据id取得持久化对象的两种方法.但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更高.下边具体说一下get和load的不同,有些时候为了对照也会把find加进来. 1.从返回结果上对照: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索运行机制上对照: get方法和fin

Hibernate之持久化对象

时间:2017-1-19 23:00 --Hibernate持久化类的状态 1.持久化类:就是一个实体类与数据库建立了映射. 2.Hibernate为了方便管理持久化类,将持久化类分为了三种状态:    1)瞬时态:transient(临时态)    2)持久态:persistent    3)脱管态:detached(离线态) --三种持久化对象的状态 1.三种持久化对象的状态    1)瞬时态        不存在持久化标识OID,尚未与Hibernate Session关联对象,被认为处于

hibernate中持久化对象的生命周期(转载)

三态的基本概念 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: 2, 持久化状态(Persistent):与session关联并且在数据库中有相应数据.已经持久化,加入到了Session缓存中.如通过hibernate语句保存的对象.处于此状态的对象叫持久对象: 3, 游离状态(Detached):持久化对象脱离了Session的对象.如Session缓存被清空的

Hibernate(二)持久化对象的状态

简介 以前学习Hibernate的笔记,整理一下便发出来了,防止弄丢.有错误的话麻烦各位留言评论,感激不尽. 持久化类 Hibernate完成了从面向对象模型表示的对象至关系模型表示的数据结构的映射,可以用面向对象的方式来处理数据库中记录.通过映射文件或注解,将持久化类映射为数据库中的表,而不需要继承任何类或者接口(即,低入侵式设计)- 但有几点最基本的要求: - 无参构造器 - 标识属性,最好使用基本类型的包装类 - 相应的getter/setter方法 瞬态 由new创建的对象且未与Sess

Hibernate持久化对象状态

在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 分别是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状态 由new命令开辟内存的java对象.例如:Student stu= newStudent();若没有变量对他引用,则被jvm回收.瞬时对象在内存中孤立存在,他的意义仅是携带信息的载体,不和数据库中的数据有任何的关联.通过session的save()和saveOrUpdate()方法可以把一个瞬时

2.一起来学hibernate之配置文件1与持久化对象

学框架,配置都是不可少的,有了配置,框架才知道我们想做什么,才知道如何去执行我们需要的操作! hibernate的配置文件,总体来说分为两个部分: 1.主配置文件hibernate.cfg.xml文件,一般放在classpatn路径下 2.映射文件xxx.hbm.xml文件,一般跟实体类放在同一个包下 前者是配置相关的数据库以及引入的映射文件信息,而后者则主要配置对象与表之间的映射关系: 注意:配置文件的路径,因人而异,有的将映射文件集体放置在一起也有,所以看个人喜好,没有强制规定如何存放. 以

Hibernate持久化对象的状态

1. 站在持久化的角度 , Hibernate 把对象分为 4 种状态 : 持久化状态, 暂时状态, 游离状态(脱管状态) , 删除状态.Session 的特定方法能使对象从一个状态转换到还有一个状态 . 2. 暂时状态(Transient) : 1). 在使用代理主键的情况下 , OID 通常为 null 2). 不处于 Session 的缓存中 3). 在数据库中没有相应的记录 3. 持久化状态(也叫"托管" )( Persist) 1). OID 不为 null 2). 位于 S

hibernate 持久化对象的生命周期

包括三种状态:瞬态(自由态),持久态,托管态(游离态) 自由态 持久化对象的自由态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联. 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中. 游离态 处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态.也就是说Session实例是持久态对象的宿主环境,一旦宿主环境失效,那么持久态对象迚入游离状态. session.beginTransaction(); Us

Hibernate持久化对象的三种状态

在Hibernate中,持久化对象在被操作的过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的.Session的特定方法能使对象从一个状态转换到另一个状态. 持久化对象的生命周期有三种,瞬时状态.持久状态和分离状态.如下图: 瞬时态 不曾进行持久化,未与任何Session相关联.此状态的对象是用new关键字创建出来的,此时对象没有和数据库中记录对应. //Transient状态 Useruser = new User();