Hibernate持久化,生命周期
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();
}
}
- 支持缓存
- 支持快照
- 支持导航查询:所谓的导航查询就是,通过一个表直接获得关联的表的数据。
- 关闭 close()
- 清空 clear()
- 清空指定的实体态对象 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();
|
当实体对象变成持久态对象的时候,和数据库表关联后。在session中会保存两份数据的副本。
一份是缓存,一个是快照。
缓存的作用:用于提高查询的效率
快照的作用:用于更新数据,作对比使用。
快照的支持就是持久态对象直接可以通过直接修改属性值更数据库表的数据,不需要update方法。
|
- 在获得数据库记录的那一刻,Hibernate同时将数据产生两个副本,快照和缓存。
- 在修改持久态对象的数据时,同时也修改了缓存的数据
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();
}
}
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;
}
}
<?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>
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();
}
}
Hibernate持久化,生命周期的更多相关文章
- hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作
Session缓存原理 为了能够在控制台更好的看到我们的hibernate干了些什么,可以在hibernate.cfg.xml文件中写入如下配置: <!-- print all generate ...
- hibernate 持久化对象的生命周期 2.1
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
- hibernate 持久化对象的生命周期
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
- Hibernate的三种状态及对象生命周期
理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 06.Hibernate实体类生命周期
前言:Session接口是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的增删查改方法,而且Session具有一个缓存它是Hibernate的一级缓存.站在持久化层的角度 ...
- Hibernate学习(4)- Hibernate对象的生命周期
1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联:2.持久化状态(Pa ...
- Hibernate中Java对象的生命周期
一个对象的出生源于我们的一个new操作,当我们使用new语句创建一个对象,这个对象的生命周期就开始了,当我们不在有任何引用变量引用它,这个对象就的生命就此结束,它占用的内存就可以被JVM的垃圾回收器回 ...
- Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结
1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...
随机推荐
- 如何使用REDIS进行微服务间通讯
如何使用REDIS进行微服务间通讯 尽可能避免service - to - service通信.为此,需要在服务之间推一个消息队列.回顾一下微服务的概念小型的,非常集中的进程彼此独立运行并且易于维护, ...
- python 椭球面
作者:chaowei wu链接:https://www.zhihu.com/question/266366089/answer/307037017来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...
- PHP的ini_set函数用法
PHP ini_set用来设置php.ini的值,在函数执行的时候生效,脚本结束后,设置失效.无需打开php.ini文件,就能修改配置,对于虚拟空间来说,很方便. 函数格式:string in ...
- 文献阅读 | Resetting histone modifications during human parental-to-zygotic transition
Resetting histone modifications during human parental-to-zygotic transition 人类亲本-合子转变中组蛋白修饰重编程 sci-h ...
- The Matrix | 黑客帝国
今天又刷了一遍,依旧跟第一次看一样,非常惊叹震撼,同时也发现了更多的细节. 梳理一下情节: 开始就是Trinity在matrix里被黑衣人Agent追杀,Trinity团队的目的是寻找Neo,显然Ag ...
- 004 DOM01
一:说明 1.Js的三个部分 ECMAScripts标准:JS的基本语法 DOM:文档对象模型,操作页面的元素的 BOM:浏览器对象模型,操作浏览器 2.术语 文档:一个页面就是一个文档 元素:页面中 ...
- [转]EL表达式判断是否为空,判断是否为空字符串
原文地址:https://blog.csdn.net/zhaofuqiangmycomm/article/details/79442730 El表达式判断是否为空字符串 ${empty 值} 返回t ...
- Typescript中的可索引接口 类类型接口
/* 5.typeScript中的接口 可索引接口 类类型接口 */ /* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用 ...
- ISO/IEC 9899:2011 条款6.5.4——投射操作符
6.5.4 投射操作符 语法 1.cast-expression: unary-expression ( type-name ) cast-expression 约束 2.除非类型名 ...
- 003-结构型-05-桥接模式(Bridge)
一.概述 将抽象部分与它的具体实现部分分离.使它们都可以独立地变化.通过组合的方式建立两个类之间联系,而不是继承. Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最 ...