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 ...
随机推荐
- laravel 通过ftp上传的时候报错 Use of undefined constant FTP_BINARY - assumed 'FTP_BINARY
用Laravel中的filesystems里面的ftp上传文件时报错.在windows上开发,文件上传的时候碰到上面的问题,搜了些资料,发现是php7的ftp拓展默认未开启. filesystems是 ...
- C语言实现简单的停车场管理系统
问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放.若车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入.当停车场中的车离开时,由于通道窄,在它后面呢 ...
- win10: ctrl+shift不能切换输入法的问题
习惯了使用Ctrl+Shift切换输入法,乍然切换到Win10,很不适应,可用以下方法修改之. 1. 点击开始菜单,点击“设置”按钮 2. 选择“时间与语言” 3. 选择“区域和语言”按钮,查看右 ...
- 清除input的历史记录
原始代码: <input class="" type="text"></input> 加上“autocomplete”属性,禁止历史的显 ...
- [转]EL表达式判断是否为空,判断是否为空字符串
原文地址:https://blog.csdn.net/zhaofuqiangmycomm/article/details/79442730 El表达式判断是否为空字符串 ${empty 值} 返回t ...
- Flutter AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换
Flutter AppBar 自定义顶部按钮图 标.颜色 属性 描述 leading 在标题前面显示的一个控件,在首页通常显示应用 的 logo;在其他界面通常显示为返回按钮 title 标题,通常显 ...
- Cocoa Framework中GB2312与UTF16编码之间的相互转换
代码如下: NSString *orgStr = @"你好,世界!"; NSStringEncoding enc = CFStringConvertEncodingToNSStri ...
- pls_integer类型
转: pls_integer类型 2011-08-22 16:49:06 heqiyu34 阅读数 13413更多 分类专栏: Oracle 今天在看一个触发器代码的时候碰到了一个pls_inte ...
- lombok插件/slf4j中字符串格式化
大家在编写springboot项目的过程中可能会接触到lombok这个插件,这个插件可以在编译时帮我生成很多代码. 1.@Data生成Getter和Setter代码,用于类名注释 2.@Getter ...
- HTML布局水平导航条2制作
前两个博文导航条都不是铺满水平的浏览器的,很多导航条样式都是随着浏览器的移动,是100%.此外前两个博文导航条都是块状点击的,也就是给a标签加宽高,设置成块状显示,点击的时候不一定要点文字,只要点击该 ...