一、事务操作。

代码:

  @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(二)的更多相关文章

  1. JAVA 框架hibernate (三)(数据库更新丢失)

    一.场景: 我们在并发操作数据库同一个字段,比如:name:tom  age:22这条数据.有2个同时进行操作.A操作该数据的name改成admin,B操作这条数据的age改成:35.然后A先把数据更 ...

  2. JAVA框架--hibernate、struts2、spring

    JAVAEE——spring01:介绍.搭建.概念.配置详解.属性注入和应用到项目   JAVAEE——struts2_04:自定义拦截器.struts2标签.登陆功能和校验登陆拦截器的实现   JA ...

  3. java框架之Spring(4)-Spring整合Hibernate和Struts2

    准备 导包 Struts2 导入 Struts2 zip 包解压目录下 'apps/struts-blank.war' 中所有 jar 包,如下: asm-3.3.jar asm-commons-3. ...

  4. Hibernate框架简介(二)基本使用增、删、改、查

    一.Hibernate框架简介 Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具 1.1.理解持久化 瞬 ...

  5. 二,java框架学习

    二,java框架学习 实体类的编写规则 实体类里面的属性是私有的 私有属性使用公开的set,get,方法操作 要求实体类有属性作为唯一值(一般使用id值) 实体类属性建议不使用基本数据类型,使用基本数 ...

  6. 【JAVA框架】Hibernate 与Mybatis 区别

    Hibernate Mybatis 简介 区别 与联系 欢迎提出见解及转载. 1 简单简介     1.1    Hibernate 框架          Hibernate是一个开放源代码的对象关 ...

  7. java 三大框架 hibernate部分知识实现增删该查操作

    1.三层架构    表现层 web层(MVC是一个表现层的设计模型)    业务层 service层    持久层 dao层2.三大框架和三层架构的关系(建议学习三大框架的顺序:先学习hibernat ...

  8. 持久化框架Hibernate 开发实例(一)

    1 Hibernate简介 Hibernate框架是一个非常流行的持久化框架,其中在web开发中占据了非常重要的地位, Hibernate作为Web应用的底层,实现了对数据库操作的封装.HIberna ...

  9. 2016年7款最流行的Java框架

    虽然Java一直被唱衰,但是直到现在Java也坚持霸主地位不动摇,毫无疑问,Java是目前最热门的编程语言之一,所以我们为大家搜集了一些目前比较受欢迎的Java框架的消息. 根据RebelLabs对在 ...

  10. .net基础学java系列(二)IDE 之 插件

    上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...

随机推荐

  1. git命令(持续更新)

    将远程仓库中的代码下载到本地仓库:git clone git仓库地址 将本地仓库中修改的文件提交到远程仓库:git push -u origin master 将当前目录添加到本地仓库,.表示当前目录 ...

  2. systemd管理服务

    [root@zbs-staging-api system]# cat /lib/systemd/system/ncmulti@.service [Unit] Description=many on % ...

  3. mysql-学习笔记1

    1.while循环的一个方便的用法是循环处理一个SQL查询结果中的数据行. 2.mysqli_fetch_array(),这个内置的PHP函数从一个数据库查询的结果中获取一个数据行,可以搭配while ...

  4. linux下将本地文件上传到github中?

    今天编写一份Python基础代码,经过Linux上传到github上,遇到点问题,已经解决 1.首先sudo su 进入root 用户 2.ls 检查出当前文件下有什么文件 3. cd 进入你将要上传 ...

  5. SD配置步骤清单

    定义销售组织 定义分销渠道 定义产品组 给公司代码分配销售组织 给销售组织分配销售渠道 给工厂分配销售组织.分销渠道 给销售组织分配产品组 定义销售范围 定义装运点 给工厂分配装运点 维护工厂的装运点 ...

  6. java发起HTTP请求的共用类

    一定要注意编码,请求时,content-type里的编码,仅仅是流的编码,而结果的编码类型,则是流转化为字符串是需要设定的. 以下是3种使用get/post的方式: import java.io.Bu ...

  7. 排错-Ad Hoc Distributed Queries组件被禁用的解决办法

    Ad Hoc Distributed Queries组件被禁用的解决办法 by:授客 QQ:1033553122 SQL Server 阻止了对组件 'Ad Hoc Distributed Queri ...

  8. ESLint 使用方法

    一.全局安装 npm install -g eslint 二.生成配置文件 在项目根目录执行init,生成.eslintrc文件.在init时,要求根目录存在package.json.当然也可以直接复 ...

  9. [我的阿里云服务器] —— WordPress Permalink Settings

    前言: 固定链接(Permalink)是博客日志.分类及其他博客内容列表的永久URL. 别人可以通过固定链接链接到你的文章上,你也可以在email中发送某篇日志的链接. 所有日志的URL应为永久性.固 ...

  10. jQuery EasyUI datagrid列名包含特殊字符会导致表格错位

    首先申明:本文所述的Bug存在于1.3.3以及更高版本中,其它低版本,本人未测试,太老的版本不想去折腾了. 洒家在写前端的SQL执行工具时,表格用了 jQuery EasyUI datagrid,因为 ...