一、事务操作。

代码:

  @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. php命令行按模板生成应用的入口文件

    接着这篇文章php命令行生成项目结构 继续改造: ghostwu@dev:~/php/php1/12$ tree . ├── app │   └── index.php ├── core │   ├─ ...

  2. Linux中编译安装软件的基本流程

    1. 准备软件包源文件 从互联网下载相应的软件包(以 .tar.gz 或 .tar.bz2 为后缀),将tarball文件解压到/usr/local/src目录下,并切换到软件包目录下 : 2. ./ ...

  3. nodejs 知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.添加模块:保存到package.json文件中; # npm install vue --save    注意 ...

  4. angularjs1.X获取前一天日期

    $scope.getDate = new Date(); //可以当前日期 $scope.nowDate = $filter("date")($scope.getDate, &qu ...

  5. JUnit手动设计测试方法以及与Randoop的自动生成测试的比较

    手动设计测试 在已有的web project本地目录lib文件夹里导入两个jar文件(版本可不一样):junit-4.12.jar和hamcrest.jar 打开eclipse,导入项目,右击项目选择 ...

  6. LeetCode 题解之Reverse Words in a String

    1.题目描述 2.问题分析 使用一个vector存储每个单词. 3.代码 void reverseWords(string &s) { vector<string> v; for ...

  7. ionic默认样式android和ios差异

    ionicframework中android和ios在默认样式上有一些不同的地方,官方文档中都有说明,但是经常会想不起. 一.差异: 1.tab位置,$ionicConfigProvider, tab ...

  8. Azure 中的 Windows 虚拟机概述

    Azure 虚拟机 (VM) 是 Azure 提供的多种可缩放按需分配计算资源之一. 通常情况下,如果需要以更大的力度(相对于其他控制选项)控制计算环境,则应选择 VM. 本文介绍创建 VM 之前的注 ...

  9. commons-pool 解析

    首先抛出个常见的长连接问题: 1  都知道连接MySQL的应用中大多会使用框架例如 c3p0 ,dbcp proxool 等来管理数据库连接池. 数据库连接池毫无疑问都是采用长连接方式. 那么MySQ ...

  10. 配置jboss EAP 6.4 数据库连接超时时间

    Environment Red Hat JBoss Enterprise Application Platform (EAP) 6.x 7.x Issue Server throws followin ...