JAVA框架:hibernate(二)
一、事务操作。
代码:
@Test
public void tr_Up(){
Session session=hibernateUtils.getSession();
Transaction transaction=session.beginTransaction();
Customer customer=new Customer();
try {
Customer c=session.get(Customer.class,1L);
c.setName("ooop");
//提交事务。
transaction.commit();
}catch (Exception ex)
{
transaction.rollback();
ex.printStackTrace();
}
finally {
session.close(); } }
分三部分:使用try catch finally来控制事务。try正常执行的代码 catch捕捉错误如果有错误,就回滚。finally最后释放资源。
二、持久化类。
持久化类就是java类,这个java类和表建立映射关系。就是持久化类。也就是说javabean+xx.hbm.xml(映射文件)组成了持久化类。
持久化类的规则:
1、提供一个无参数的构造器。
2、提供一个标识属性,映射数据库主键字段。-- 唯一标识OID.数据库中通过主键.Java对象通过地址确定对象.持久化类通过唯一标识OID确定记录。
3、所有属性提供public访问修饰,提供get或者set方法。
4、标识属性应尽量使用基本数据类型的包装类。
三、持久化类的状态:
1、瞬时态:没有持久化标识:OID,没有被纳入session管理。
2、持久态:被session管理,有持久化标识OID。
3、托管态:有持久化标识OID,没有纳入session管理。
三个状态转换:
1. 瞬时态 -- 没有持久化标识OID, 没有被纳入到Session对象的管理
* 获得瞬时态的对象
* User user = new User()
* 瞬时态对象转换持久态
* save()/saveOrUpdate();
* 瞬时态对象转换成脱管态
* user.setId(1)
2. 持久态 -- 有持久化标识OID,已经被纳入到Session对象的管理
* 获得持久态的对象
* get()/load();
* 持久态转换成瞬时态对象
* delete(); --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的)
* 持久态对象转成脱管态对象
* session的close()/evict()/clear();
3. 脱管态 -- 有持久化标识OID,没有被纳入到Session对象的管理
* 获得托管态对象:不建议直接获得脱管态的对象.
* User user = new User();
* user.setId(1);
* 脱管态对象转换成持久态对象
* update();/saveOrUpdate()/lock();
* 脱管态对象转换成瞬时态对象
* user.setId(null);
4. 注意:持久态对象有自动更新数据库的能力!!!
对持久化对象有自动更新数据库的能力理解:
@Test
public void Cjobj(){
Session session=hibernateUtils.getSession();
Transaction tr=session.beginTransaction();
// 通过get方法,对象持久化。可以直接使用set方法来更新值。也就是持久化对象有更新数据库的能力。
Customer c=session.get(Customer.class,4L);
c.setName("cook");
// 不需要update。也可以使用update进行更新。
tr.commit();
session.close();
}
}
为什么获取持久化对象之后,持久化对象通过设置属性的(set方法)具有更改数据库的能力?
这是因为session一级缓存的快照功能。
快照功能图示:

session缓存功能:
1、什么是缓存,其实就是一块内存空间,将数据源(数据库或者文件)中的数据存放在缓存中,再次获取数据的时候
直接缓存中获取,提升程序的性能!
2:hibernate的提供两种缓存功能:
session的一级缓存。自带不可以卸载,一级缓存的声明周期与session一致,一级缓存称为:session级别的缓存。
二级缓存:默认没有开启,需要手动配置才可以使用,二级缓存其实加强一级缓存 ,提升其生命周期。二级缓存可以给多个session提供数据共享。二级缓存也叫做sessionfactory级别缓存。
3、session缓存概述:
session接口中,有一系列的java集合,这些java集合构成Session级别缓存(一级缓存)。将对象存入一级缓存。session没有结束生命周期
那么对象在session中存放着。
内存中包含session实例--->session的缓存(一些集合)--->集合中包换缓存对象!!!
怎么证明session有缓存功能呢?
通过2次查询,看日志输出的sql语句几次:
@Test
public void sessionMem(){
Session session=hibernateUtils.getSession();
Transaction tr=session.beginTransaction();
Customer c=session.get(Customer.class,4L);
System.out.println(c.getName());
Customer c1=session.get(Customer.class,4L);
System.out.println(c1.getName());
tr.commit();
session.close();
}
结果:

只有一次查询语句。说明第二次查询走的是session缓存。
四、主键
如果我们主键类型采用int、long、short类型可以使用:native。
如果我们主键类型是:varchar、char的时候选择:uuid。
JAVA框架:hibernate(二)的更多相关文章
- JAVA 框架hibernate (三)(数据库更新丢失)
一.场景: 我们在并发操作数据库同一个字段,比如:name:tom age:22这条数据.有2个同时进行操作.A操作该数据的name改成admin,B操作这条数据的age改成:35.然后A先把数据更 ...
- JAVA框架--hibernate、struts2、spring
JAVAEE——spring01:介绍.搭建.概念.配置详解.属性注入和应用到项目 JAVAEE——struts2_04:自定义拦截器.struts2标签.登陆功能和校验登陆拦截器的实现 JA ...
- java框架之Spring(4)-Spring整合Hibernate和Struts2
准备 导包 Struts2 导入 Struts2 zip 包解压目录下 'apps/struts-blank.war' 中所有 jar 包,如下: asm-3.3.jar asm-commons-3. ...
- Hibernate框架简介(二)基本使用增、删、改、查
一.Hibernate框架简介 Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具 1.1.理解持久化 瞬 ...
- 二,java框架学习
二,java框架学习 实体类的编写规则 实体类里面的属性是私有的 私有属性使用公开的set,get,方法操作 要求实体类有属性作为唯一值(一般使用id值) 实体类属性建议不使用基本数据类型,使用基本数 ...
- 【JAVA框架】Hibernate 与Mybatis 区别
Hibernate Mybatis 简介 区别 与联系 欢迎提出见解及转载. 1 简单简介 1.1 Hibernate 框架 Hibernate是一个开放源代码的对象关 ...
- java 三大框架 hibernate部分知识实现增删该查操作
1.三层架构 表现层 web层(MVC是一个表现层的设计模型) 业务层 service层 持久层 dao层2.三大框架和三层架构的关系(建议学习三大框架的顺序:先学习hibernat ...
- 持久化框架Hibernate 开发实例(一)
1 Hibernate简介 Hibernate框架是一个非常流行的持久化框架,其中在web开发中占据了非常重要的地位, Hibernate作为Web应用的底层,实现了对数据库操作的封装.HIberna ...
- 2016年7款最流行的Java框架
虽然Java一直被唱衰,但是直到现在Java也坚持霸主地位不动摇,毫无疑问,Java是目前最热门的编程语言之一,所以我们为大家搜集了一些目前比较受欢迎的Java框架的消息. 根据RebelLabs对在 ...
- .net基础学java系列(二)IDE 之 插件
上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...
随机推荐
- 设计模式之建造者模式(Buider)(5)
简介 在软件开发中,也会存在一些构造非常复杂的对象,这些对象拥有一系列的成员属性,这些成员属性有些是基本数据类型,有些是引用类型,总之就是一句话,这个对象的构建比较复杂.在这里我们就将复杂对象当做汽车 ...
- 启动HDFS时datanode无法启动的坑
启动HDFS 启动hdfs,进入sbin目录,也可以执行./start-all.sh - $cd /app/hadoop/hadoop-2.2.0/sbin - $./start-dfs.sh 在此之 ...
- 【转】android系统常用URI
android系统管理联系人的URI如下:ContactsContract.Contacts.CONTENT_URI 管理联系人的UriContactsContract.CommonDataKinds ...
- 清除input numer 点击样式
input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; }
- jQuery操作table数据上移、下移和置顶
jQuery 操作table中的tr换行的步骤如下: 1.获取当前tr var $tr = $(this).parents("tr"); 2.移动tr //上移 $tr.prev( ...
- IDEA项目搭建五——使用JRebel插件实现IDEA热部署
使用IDEA开发时修改了html或js或java代码都需要编译启动浪费了很多时间,所以可以借助热部署插件实现自动编码,每次修改完代码保存后就可以刷新页面看效果很方便,热部署工具有很多在此只推荐JReb ...
- JavaScript函数节流(throttle)与函数去抖(debounce)
对于浏览器窗口大小改变的时候,来动态改变页面元素的大小,可以采用window的resize事件,实现代码: <script type="text/javascript"> ...
- CSS样式----CSS样式表的继承性和层叠性(图文详解)
本文最初于2017-07-29发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 本文重点 CSS的继承性 CSS的层叠性 计算权重 ...
- LeetCode 题解之 Positions of Large Groups
1.题目描述 2.问题分析 从头遍历字符串,使用一个局部迭代器和局部变量记录该字符个数.如果个数>= 3 ,则将此时的迭代器位置和局部迭代器的位置保存到局部vector中.再将这个局部vecto ...
- Jenkins自动构建的几种方式
1.远程URL构建 在任务配置处的构建触发器中选择远程触发,例如,在下图框中输入abc,则只需要在网页上输入地址:Jenkins_URL/job/工程名/build?token=abc 2.利用cur ...