Hibernate采用低侵入式的设计,它对持久化类几乎不做任何要求。也就是说hibernate操作的持久化类基本都是普通java对象。对于持久化类的要求这里不做说明。只就持久化对象的状态和各个状态之间的转换。
Hibernate持久化对象有如下几种状态:
1、瞬态:对象有new操作符创建,但是并没与HibernateSession关联。处于瞬态的对象是不会被持久化到数据库中的。如果程序中失去了瞬态对象的引用,瞬态对象就会被垃圾回收机制销毁。
2、持久化:持久化实力在数据库中有对应的记录,并且拥有一个持久化标识。对于持久化对象,它必须要与指定的HibernateSession关联起来。
3、托管:该对象曾经处于持久化装填,但随着与之关联的Session被关闭了,那么该对象也就变为了托管状态。
下图是hibernate持久化实例的状态演化图:
1、瞬态转变为持久化状态
当我们通过new新建一个实例时,这个实例就处于瞬态。瞬态可以通过以下几个方法转换为持久化状态。
save(Objectobj):将对象变为持久化状态,该对象的属性将被保存到数据库中。
persist(Objectobj):将对象变为持久化状态,该对象的属性将被保存到数据库中
save(Objectobj,Objectpk):将对象保存到数据库,保存到数据库时,指定主键值
persist(Objectobj,Objectpk):将对象保存到数据库,保存到数据库时,指定主键值
如果对象的标识属性是generated类型的,那么hibernate将会在执行save()方法时自动生成标识属性值,并且将该标识属性值分配给该对象,并且标识属性值会在sava()被调用时自动产生并分配给该对象。如果对象的标识属性是assigned类型的,或者是复合主键,那么该标识属性值应该在调用save()方法之前手动赋予给该对象。
在使用save()和persist()方法的时候,有一个区别:使用save()方法保存持久化对象时,该方法返回持久化对象的标识属性值。但是persist不会返回任何值。
2、加载持久化实例
我们可以使用load()方法来加载一个持久化实例,这种加载时根据持久化类的标识属性值加载持久化实例的,其实质就是根据主键从数据表中加载一条新的纪录。
同时也可以使用get()方法加载一个持久化实例。它和load方法的相同点在于两者都是根据主键装载持久化实例的。不同就在于get()会立即访问数据库,而laod()会延迟加载,不会立即访问数据库。
一旦加载了该持久化实例后,该实例就会处于持久化状态,这是如果对该持久化实例所做的修改将会保持到数据库中。
如:
这段代码会在session.flush之前自动保持到数据库中。也就是说,修改对象最简单的方法就是在Session处于打开状态时加载它,然后只见修改即可。
如下:
2、托管
当一个对象处于脱管的状态后,程序应该使用新的session来保存这些修改。hibernate提供了update()、merge()和updateOrSace()等方法来保存这些修改。
如下:
当我们用另一个session来保存这种修改后,该脱管对象会再次回到持久化状态。
当需要使用update来保存程序对持久化对象所在的修改时,如果不清楚该对象是否曾经持久化过,那么可以选择updateOrSave()方法,该方法会自动判断该对象是否曾经持久化过,如果持久化过,则使用update()来操作,否是使用save()方法。
读李刚《轻量级JavaEE 企业应用实战》
分享到:
相关推荐
5. **Session接口**:`Session`是与数据库交互的主要接口,它提供了持久化对象的方法,如`save()`, `update()`, `delete()`等。在操作数据库之前,需要调用`openSession()`获取Session实例。 6. **Transaction管理*...
Session对象是Hibernate进行持久化操作的主要接口,包括增删改查等基本操作。 ###Hibernate的增删改查操作 Hibernate通过Session对象封装了数据库操作方法,例如:增(save())、删(delete())、改(update())、...
它可以将Java对象映射到数据库表,提供了一种无需编写大量SQL语句的方式进行数据持久化。 4. **MySQL**: MySQL 是一种广泛使用的开源关系型数据库管理系统,用于存储和管理应用程序的数据。在本环境中,MySQL ...
### Hibernate—我的Hibernate学习笔记 #### 一、对象持久化的理论与实践 ...综上所述,Hibernate通过其强大且易用的API,简化了Java应用与关系数据库的交互过程,成为现代企业级应用中对象持久化的首选方案。
而Persistent状态的对象与数据库中的记录绑定,其变更会被Hibernate自动持久化。当Persistent状态的对象对应的Session关闭后,它进入Detached状态,此时对象与Session脱离,但可以通过重新关联Session恢复为...
它将Java类与数据库表关联,将对象实例与数据库记录对应,实现了数据持久化的透明性。 002---第一个Hibernate示例 创建一个简单的Hibernate应用通常涉及以下步骤:配置Hibernate环境(包括hibernate.cfg.xml文件)...
2. 说明:当执行 19 行代码的时候,person 对象由临时状态转化成持久化状态,这个时候数据库没有对应的数据,但是该对象在 Hibernate 内部。 3. 说明:当执行 20 行代码的时候,事务提交了,该对象还是持久化状态的...
Hibernate是一个在Java环境中广泛使用的数据持久化工具,它支持对象关系映射(ORM)技术,将Java对象映射到关系型数据库的表中。Hibernate允许开发者通过面向对象的方式来操作数据库,避免了直接使用SQL语句的繁琐...
Spring还包含数据访问/集成(DAO)、事务管理、JMS、电子邮件、任务调度等模块,支持多种持久化策略如JDBC、Hibernate、MyBatis等。 这四个框架常常被结合使用,形成所谓的“SSH”或“SSS”组合,以实现高效、灵活...
- **对象的三种状态**:深入理解持久化对象的瞬态、持久化、游离状态。 - **关系映射**:讲解一对一、一对多、多对多等关系类型的映射方法。 - **Hibernate查询(HQL)**:学习Hibernate Query Language的基础及高级...
Hibernate作为ORM工具,旨在消除Java应用程序与SQL之间的耦合,通过将Java对象与数据库表进行映射,实现了对象的持久化。开发者无需编写大量的JDBC代码,从而提高开发效率和代码可维护性。 1.2 Hibernate访问数据库...
### 对象持久化与Hibernate学习笔记 #### 一、对象持久化的概念与重要性 - **定义**: 对象持久化是指将程序中的对象状态存储到持久化存储设备上的过程,以便在程序结束运行后仍然可以保留这些数据。 - **必要性**:...
### Hibernate映射笔记详解 #### Hibernate映射文件与配置关系 ...总之,Hibernate映射是连接Java对象世界与数据库世界的重要桥梁,深入理解并灵活运用其各项特性和技巧,对于构建高效、稳定的持久化层具有重要意义。
- **持久化类(Persistent Class)**: 持久化类是代表数据库表的Java类,它们包含表的字段对应的属性。 - **Entity标识(Primary Key)**: 类似于数据库中的主键,用于唯一标识实体对象。 - **Session接口**: ...
- **持久态**:当一个对象已经被持久化到数据库中,并且处于Session管理下的状态。 - **脱管态**:当一个持久态对象从Session中删除后,它就变成了脱管态。 #### 八、关系映射 - **知识点概述**: - **一对一...
### Hibernate实战笔记——深入解析对象关系映射与优化策略 #### 一、对象关系映射(ORM)概念 - **什么是持久化**:在计算机科学领域,“持久化”指的是将程序的数据状态保存到非易失性的存储介质中,以便可以在...
- **ORM技术**:Hibernate实现了对象关系映射(Object-Relational Mapping,简称ORM)技术,其核心在于将Java对象自动持久化到关系数据库中。这一过程极大地简化了数据的存储和检索,允许开发者以面向对象的方式操作...