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 ...
随机推荐
- HTMLPage测试js通过ajax调用
HTMLPage测试js通过ajax调用接口 <!DOCTYPE html> <html lang="en" xmlns="http://www.w3. ...
- Vue 中Axios 使用
1.安装axios npm install axios 2.在使用的地方导入 import axios from 'axios' 3.再方法中调用 sendHttp: function () { ax ...
- DNS 预读取功能 链接预取
https://developer.mozilla.org/zh-CN/docs/Controlling_DNS_prefetching DNS 请求需要的带宽非常小,但是延迟却有点高,这一点在手机网 ...
- 给div添加disabled属性
<div id="CompanyId" name="CompanyId" type="select" ></div> ...
- PHP 对象接口
对象接口 (interface) 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容. 接口是通过 interface 关键字来定义的,就像定义一个标准的类 ...
- ISO/IEC 9899:2011 条款6.5.5——乘法操作符
6.5.5 乘法操作符 语法 1.multiplicative-expression: cast-expression multiplicative-expression * cast-e ...
- vue plupload 的使用
1. 首选npm安装plupload 2. 阿里云OSS PHP 安全上传 <template> <div class="imgUpload"> aaa ...
- gitlab 配置到jenkins
直接把公匙配到了gitlab,然后填入jenkins https://blog.csdn.net/zhufengyan521521/article/details/81219193 配置全局凭据 h ...
- 123457123456#0#-----com.cym.shuXue02--前拼后广--开心学数学
com.cym.shuXue02--前拼后广--开心学数学
- ABAP DEMO ole示例程序
*&---------------------------------------------------------------------* *& Report YCX_021 * ...