一 、生命周期
 
1.1  . 说明
持久化类就是我们所说的实体类,实体类(持久化类)对象是有状态的。
为什么实体类对象会有状态?
答:由于HIbernate框架是一个先映射,后操作的框架。所谓的状态就是实体类的对象和数据库是否有关联的情况。
是因为HIbernate是通过对象操作数据库的,对象必须要和数据库有连接,才可以操作数据库表。
我们将这个实体类对象和数据库连接的情况称为状态。
 
瞬时态:当new一个对象的时候,此时是瞬时态,内存中包含此对象,但是数据库表中无此记录
持久态:当session执行save或者saveOrUpdate方法的时候,进入持久态,此时数据库中的记录跟内存中的对象保持一致
游离态:当session中不再包含此对象的时候(clear,evict,close),此时是游离态,对象存在于内存之中,跟数据库表无关系

public class TestHBM {
@Test
public void test() {
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
// 使用new关键字创建对象的时候,叫做瞬时态
User user = new User();
user.setName("张三丰");
user.setPwd("123");
// 经过save方法之后,对象交由session来管理,进入持久态
session.save(user);
System.out.println(user.getId());
//清空session对象,进入游离态
session.clear();
System.out.println(user.getId());
user.setName("张无忌");
//再次保存之后进入持久态
session.save(user);
System.out.println(user.getId());
//进入瞬时态
//session.delete(user);
tx.comit();
factory.close();
}
}
 
 
1.2  目的:只有知道如何获得持久态的对象就可以。
有一下情况可以获得持久态对象:
更新(update/ saveOrupdate)
查询(get/load)
Hibernate持久态的对象就是正在和数据表关联的状态对象。支持条对象支持一下功能:
  1. 支持缓存
  2. 支持快照
  3. 支持导航查询:所谓的导航查询就是,通过一个表直接获得关联的表的数据。
 
 
二 、 缓存
 
HIbernate是支持一级缓存。所谓的一级缓存就是Session级别的缓存。
意思就是说,同一个session查询同样的数据,只查询一次数据库。如果出现同多次同样的查询(get/load)直接返回缓存的数据。
 
 
三  、 清空缓存的方法
 
清空缓存的三个方法。
  1. 关闭 close()
  2. 清空 clear()
  3. 清空指定的实体态对象 evit()

public void get(){
//1.获得操作对象
Session session = HibernateUtils.getSession();
//通过OID获得对应的记录
//如果支持缓存,get四次数据库,只查一次。
Student student1 = session.get(Student.class,1L);
//如果clear()清空同一个session的所有持久化对象,缓存被清空
session.clear();
Student student2 = session.get(Student.class,1L);
//evict()清空指定的持久化对象,该对象的缓存被清空
session.evict(student2);
Student student3 = session.get(Student.class,1L);
Student student4 = session.get(Student.class,1L);
//表示关闭了session。session的所有缓存被清空
session.close();
 
 
 
四、 缓存的作用:缓存的作用:就是减少查询的次数,从而提高查询的效率!!!!
 
close,clear,evit清空缓存只是将持久态转成游离态,清空的是缓存的数据,清空的是数据和数据库的关联,而不是对象原有清空数据。
 
 
五 、 快照的机制
 
 
5.1  定义
 
当实体对象变成持久态对象的时候,和数据库表关联后。在session中会保存两份数据的副本。
一份是缓存,一个是快照。
缓存的作用:用于提高查询的效率
快照的作用:用于更新数据,作对比使用。
快照的支持就是持久态对象直接可以通过直接修改属性值更数据库表的数据,不需要update方法。
 
5.2  示例代码
 
实现原理
  1. 在获得数据库记录的那一刻,Hibernate同时将数据产生两个副本,快照和缓存。
  2. 在修改持久态对象的数据时,同时也修改了缓存的数据

public class StudentDAOTest {
@Test
public void update(){
//1.获得数据库操作对象,session
Session session = HibernateUtils.getSession();
//2. Hibernate框架,操作(增删改)必须先开启事务才能操作
Transaction transaction = session.beginTransaction();
//3.创建一个实体类,并且封装数据
Student c=session.get(Student.class, 1L);
//持久态对象修改了属性,直接提交就可以更新到数据库里面
c.setStuName("李四");
//先查出来,就是变成持久态对象了,然后直接通过set 之类的就能更新数据
//5.提交事务,如果出错自动回滚
transaction.commit();
//6.关闭
session.close();
}
}
5.3 实现流程图
 

 
联合主键
 
1、创建java类:ScoreId.java
package cn.gzsxt.po;
import java.io.Serializable;
public class ScoreId implements Serializable {
private int sid;
private int subjectid;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public int getSubjectid() {
return subjectid;
}
public void setSubjectid(int subjectid) {
this.subjectid = subjectid;
}
}
Score.java
package cn.gzsxt.po;
public class Score {
private ScoreId scoreId;
private double score;
public ScoreId getScoreId() {
return scoreId;
}
public void setScoreId(ScoreId scoreId) {
this.scoreId = scoreId;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
2、编写类与表的关系映射文件 Score.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.gzsxt.po">
<class name="Score" table="t_score">
<!-- 设置联合主键 class:执行联合主键对应的类 -->
<composite-id class="ScoreId" name="scoreId">
<!-- 设置联合主键的属性 -->
<key-property name="sid"></key-property>
<key-property name="subjectid"></key-property>
</composite-id>
<property name="score"></property>
</class>
</hibernate-mapping>
3、测试
package cn.gzsxt.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
import cn.gzsxt.po.Score;
import cn.gzsxt.po.ScoreId;
public class TestHBM {
@Test
public void createTable() {
Configuration config = new Configuration().configure();
SchemaExport se = new SchemaExport(config);
// script表示脚本是否显示 export是否将脚本执行到数据库
se.create(true, true);
} @Test
public void testSave(){
Configuration config = new Configuration().configure();
ServiceRegistry register = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory factory = config.buildSessionFactory(register);
Session session = factory.openSession();
Transaction tx = session.beginTransaction(); ScoreId scoreid = new ScoreId();
scoreid.setSid(1);
scoreid.setSubjectid(1);
Score score = new Score();
score.setScore(100);
score.setScoreId(scoreid);
session.save(score);
tx.commit();
session.close();
factory.close();
}
}
注意:   1、实现联合主键,必须在联合主键类上实现序列化接口
      2、配置联合主键属性的时候,必须加name属性值,与类中的某一个属性相关联
      3、在执行DML操作的时候,可以设置hbm2ddl.auto属性,选择合适的模式创建表对象

Hibernate持久化,生命周期的更多相关文章

  1. hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作

    Session缓存原理 为了能够在控制台更好的看到我们的hibernate干了些什么,可以在hibernate.cfg.xml文件中写入如下配置: <!-- print all generate ...

  2. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  3. hibernate 持久化对象的生命周期

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  4. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

  5. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. 06.Hibernate实体类生命周期

        前言:Session接口是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的增删查改方法,而且Session具有一个缓存它是Hibernate的一级缓存.站在持久化层的角度 ...

  7. Hibernate学习(4)- Hibernate对象的生命周期

    1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联:2.持久化状态(Pa ...

  8. Hibernate中Java对象的生命周期

    一个对象的出生源于我们的一个new操作,当我们使用new语句创建一个对象,这个对象的生命周期就开始了,当我们不在有任何引用变量引用它,这个对象就的生命就此结束,它占用的内存就可以被JVM的垃圾回收器回 ...

  9. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

随机推荐

  1. 【转】php7+IIS 配置环境(windows环境)

    继php7+apache2.4 配置环境(window环境)后,由于B2C项目准备上线:特此小编在阿里云上搭建PHP7环境,为此特写上搭建过程希望正处于搭建php7+IIS(windows环境)中的朋 ...

  2. GB28181技术基础之1 - SIP协议

    SIP 协议,即 会话初始协议(Session Initiation Protocol),是一个应用层的 点对点协议,用于初始.管理和终止网络中的语音和视频会话,是 GB28181 的核心之一. 按照 ...

  3. hdfs 通过命令坏块监测和删除或者地址获取参数做监控

    [root@nodecm.oldboy.org.cn /data/dfs/nn/current]# hdfs fsck -list-corruptfileblocksConnecting to nam ...

  4. Tomcat7/8/8.5三种版本的redis-session-manager的jar和xml配置均不同

    chexagon/redis-session-manager: A tomcat8 session manager providing session replication via persiste ...

  5. Kali Linux软件更新日报20190623

    Kali Linux软件更新日报20190623   (1)payloadsallthethings更新到2.0-0kali4,此次更新增加帮助脚本. (2)tftpd32更新到4.50-0kali2 ...

  6. disruptor 单生产者多消费者

    demo1 单生产者多消费者创建. maven 依赖 <!-- https://mvnrepository.com/artifact/com.lmax/disruptor --> < ...

  7. ionic4 路由跳转、ionic4 路由跳转传值 NavController 返回上一页 、NavController 回到根

    1.普通路由跳转 <ion-button [routerLink]="['/pinfo']"> 跳转到详情 </ion-button> <ion-he ...

  8. ISO/IEC 9899:2011 条款6.5.5——乘法操作符

    6.5.5 乘法操作符 语法 1.multiplicative-expression: cast-expression multiplicative-expression    *    cast-e ...

  9. pytorch求范数函数——torch.norm

    torch.norm(input, p='fro', dim=None, keepdim=False, out=None, dtype=None) 返回所给tensor的矩阵范数或向量范数 参数: i ...

  10. RabbitMQ 入门教程(PHP版) 第六部分:远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,把一部分计算任务分配到其他节点来完成.RabbitMQ 如何使用 RPC 呢?下面将会通过其它节点完成斐波纳契示例. 流程图  当客户端启动时,它 ...