`

Hibernate开发笔记_day02缓存,主键生成方式

 
阅读更多
1.Hibernate框架的映射类型
   在hbm中定义属性和字段映射时指定的type属性。作用是完成属性类型和字段类型之间的相互转化。
允许使用以下两种格式
    a.Java类型
       java.lang.Integer,java.lang.Boolean,java.lang.String
       java.sql.Date
    b.Hibernate类型(推荐)
       整数:integer,long
       浮点数:double,float
       字符串:string
       日期:date  日期格式只有年月日
       时间:timestamp 日期格式包括时分秒
       布尔:yes_no 将布尔属性与Y和N映射
              true_false 将布尔属性与T和F映射
       其他:blob,clob,big_decimal,big_integer

2.Hibernate框架的主键生成方式
   在添加操作时,Hibernate会根据hbm.xml中定义的
元素,生成一个主键值。Hibernate提供的常用
类型如下:
    a. identity
      采用数据库自动增长机制生成主键值。一般应用于MySQL,SQL Server数据库
(插入数据时候不需要出入自动增长主键值,即时手动插入,也不会起作用,还是安装原来的自动增长给id赋值)

    b.sequence
      采用一个序列生成主键值,该序列名字可以指定,也可以采用默认名。一般应用Oracle数据库
    <generator class="sequence">
       <!--foo_seq是我们定义的序列-->
<param name="sequence">foo_seq</param>   
   </generator>

    c.native
      根据指定的方言类型,自动选择identity,sequence等方式。
    d.increment
      首先执行select max(id)获取主键最大值,然后加1执行插入操作。
    e.assigned
      意思是要Hibernate放弃主键生成。该主键值需要程序员在程序中显式给主键属性赋值再执行添加操作。
    f.其他
       uuid:采用uuid算法生成一个字符串类型的主键值
       hilo:采用高低位算法生成一个数值类型的主键值
    g.自定义主键生成方式
      编写一个实现类,实现IdentifierGenerator接口的
generator()方法。
      使用方法
<generator class="包名.类名"></generator>

/**
* 自定义主键生成器
* @author Administrator
* 返回YYYYMMDDXXXX格式的id
*/
public class Demo1Id implements IdentifierGenerator {

// 自动调用,将返回值当作主键值201208140001
// 返回YYYYMMDDXXXX格式的id 201208140002
public Serializable generate(SessionImplementor arg0, Object arg1)
throws HibernateException {
String id = "";// 要返回的id
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dt = sdf.format(new Date());
System.out.println(dt);
// 执行查询
Session session = HibernateUtil.getSession();
String hql = "from Demo1 where id like ?";
Query query = session.createQuery(hql);
query.setString(0, dt + "%");
List<Demo1> list = query.list();
// 判断list是否有元素
if (list.isEmpty()) {
id = dt + "0001";
} else {
// 获取最后一个元素
Demo1 demo = list.get(list.size() - 1);
// 获取最大的id
String tmpId = demo.getId();
// 将后四位切割出来
String tmpno = tmpId.substring(8);
System.out.println(tmpno);
// 将末4位+1
int nextno = Integer.parseInt(tmpno) + 1;
// 将nextno格式化成XXXX
// TODO 有待完善
id = dt + "000" + nextno;
}
return id;
}
}




3.Hibernate对象的状态
   1)临时状态
       指的是new方式创建的对象,在程序结束后立刻销毁。
   2)持久状态
       指的是和Session对象发生关系,由管理的对象。
       持久对象在事务结束后,Session负责将对象状态与数       据库同步。
       Hibernate也可以称为持久层框架。利用Hibernate构        建一个持久层,管理对象的持久性。
   3)游离状态/脱管状态
      指的是Session关闭后,原来由Session管理的对象就会      变成脱管状态。
============================  
   持久对象处于持久状态,具有持久性,它有以下几个特点
   a.使用load,get,save,saveOrUpdate,iterator方法操作的对象具有持久性。 
   b.持久对象受Session管理的,在Session缓存中。
   c.在Session缓存中的对象,当事务结束,如果对象状态发生改变,Session会负责同步到数据库。
     在执行session.flush时执行同步操作,commit方法在内部执行了flush,然后再提交事务。

4.Hibernate框架的基本特性
   1)Hibernate一级缓存
      默认开启,它属于Session对象级别的缓存,受Session管理。当Session对象创建时创建,Session对象销毁时销毁。
      在使用get,load方法查询时,Session首先去一级缓存查找,如果找不到再去数据库查询。在Session第一次查找时,会将对象放入一级缓存,后续直接从缓存获取,减少对数据库的访问。
      注意:一级在使用同一个Session对象多次访问同一个实体对象时才有意义。
      为了更好的使用一级缓存机制,需要保证业务处理中使用的Session是同一个。实现方法有以下两种:
    方法一:改造HibernateUtil,利用ThreadLocal技术对Session进行管理。
    方法二:从Hibernate3之后,将ThreadLocal技术封装到框架中,使用框架封装之后的功能。
    a.调用SessionFactory.getCurrentSession();方法
      该方法可以获取当前线程绑定的Session对象
    b.在hibernate.cfg.xml配置中,开启current_session配置

   thread
 
    c.CurrentSession使用的注意事项
     该session操作需要在一个事务中进行。
     该session是在事务结束时自动关闭,不需要程序员close

问题:SessionFactory中的openSession()和getCurrentSession()有什么区别。
      openSession获取一个新的session对象,使用完毕需要close();
      getCurrentSession获取当前已有的session,没有才新创建一个,使用时需要在一个事务中,在事务结束后会自动关闭。

----清除一级缓存中的持久对象的方法------
session.clear();//清除缓存中所有的对象
session.evict(obj);//清除缓存中指定的obj对象

Session session = getSession();
for(int i=1;i<1000){ 
session.save(user);
  //执行20save就同步一次,然后清除缓存
  if(i%20==0){
     session.flush();//同步到数据库
     session.clear();//清空缓存
  }
}
//提交事务
tx.commit()
分享到:
评论

相关推荐

    hibernate_day02笔记

    【hibernate_day02笔记】...以上就是Hibernate_day02笔记中的主要知识点,包括ORM思想、实体类设计、主键策略、操作实体类的方法、对象状态、一级缓存以及事务管理。这些内容构成了使用Hibernate进行数据库操作的基础。

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4

    6.1 案例分析:结合黑马程序员的day1至day4的讲义和笔记,深入理解在实际项目中如何应用Hibernate,解决具体问题。 总结,Hibernate作为强大的ORM框架,为Java开发者提供了便利,通过理解并熟练掌握其核心概念、...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day03

    《Hibernate框架开发详解——以黑马程序员2016版讲义和笔记为引导》 Hibernate,作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更专注于业务逻辑而不是繁琐的数据访问...

    传智博客Hibernate框架2016版笔记资料day01~02

    【标题】"传智博客Hibernate框架2016版笔记资料day01~02" 涵盖了对Hibernate框架的基础至进阶知识的学习,是针对2016年版本的一份详实教程。Hibernate作为Java领域内的一款强大、流行的持久化框架,它简化了数据库...

    spring hibernate 事务管理学习笔记(二)

    在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...

    hibernate学习笔记第二天的源码

    **正文** 在深入探讨Hibernate学习笔记第二天的源码之前,我们先来理解一下...通过分析`hibernate_day02`的源码,我们可以深入理解Hibernate的这些关键概念,从而更好地掌握ORM技术,提升我们的Java开发能力。

    达内教学课件Hibernate

    - `java_hibernate_day02_2.xps` 可能涉及实体类定义、属性映射、主键生成策略等基础知识。 - `java_hibernate_day03_3.xps` 可能涵盖查询语言HQL(Hibernate Query Language)和 Criteria API 的使用。 - `java_...

    hibernate学习笔记第三天的源码

    Hibernate支持多种主键生成策略,如`GenerationType.AUTO`(默认,由数据库自动生成)、`GenerationType.IDENTITY`(类似自增列)等。 4. **SessionFactory与Session**:SessionFactory是线程安全的,用于创建...

    hibernate学习笔记第四天的源码

    **hibernate学习笔记第四天源码解析** 在hibernate学习的过程中,第四天通常会深入探讨实体类、映射文件、配置文件以及查询语言等方面的内容。这些是hibernate框架的基础,也是开发者掌握持久化操作的关键。让我们...

    hibernate学习笔记

    《Hibernate学习笔记详解》 Hibernate,作为Java领域中的一款强大持久化框架,...通过阅读《hibernate_day01.txt》至《hibernate_day06.txt》的学习笔记,你可以逐步深入到Hibernate的每一个细节,成为ORM领域的专家。

    Hibernate3.2详细教程及课程笔记

    《Hibernate 3.2 详细教程及课程笔记》是一份专为Java开发者设计的深入学习指南,旨在帮助已经具备Java基础知识的学习者熟练掌握Hibernate框架,并能够将其应用到实际的项目开发中。本教程覆盖了从基础概念到高级...

    day36-hibernate检索和优化 02-Hibernate检索方式:简单查询及别名查询

    本教程将深入探讨"day36-hibernate检索和优化 02-Hibernate检索方式:简单查询及别名查询"的主题,通过源码分析和实际工具的应用,来提升数据库查询的效率。 首先,我们了解Hibernate的检索方式。在Hibernate中,...

    Hibernate-day01

    【标题】:“Hibernate-day01”指的是一个关于Hibernate框架的基础学习教程,可能是一个课程或研讨会的第一天内容。Hibernate是Java开发中的一个对象关系映射(ORM)工具,它简化了数据库与Java对象之间的交互。 ...

    hibernate资料

    3. **对象关系映射(ORM)**:讲解Hibernate如何通过XML或注解方式定义对象关系映射,包括Entity类的创建、主键生成策略以及属性映射。 4. **Session和Transaction**:阐述Hibernate的核心接口Session,它是与...

    韩顺平hibernate3.3视频教程源码4-5day

    Hibernate作为一个持久化框架,它使得Java开发者能够通过面向对象的方式来操作数据库,极大地简化了数据访问层的开发工作。安装过程中,需要设置相关的环境变量,包括JDBC驱动和Hibernate库,并配置hibernate.cfg....

    2016hibernate资料.zip

    - 主键生成策略:探讨多种主键生成策略,如IDENTITY、SEQUENCE、TABLE等,以及它们在不同数据库环境下的适用性。 3. **持久化操作** - CRUD操作:逐一解析Create(创建)、Read(读取)、Update(更新)和Delete...

    hibernate框架基础教程适合新手

    Hibernate是一个强大的Java持久化框架,它为开发人员提供了一种简单、高效的方式来处理数据库操作。这个基础教程针对新手,旨在让初学者从零开始掌握Hibernate的核心概念和使用方法。 1. **Hibernate概述** ...

    hibernate培训第三天

    **hibernate培训第三天** ...在达内的hibernate培训笔记中,每个Day3的章节可能都会详细讲解上述知识点,并通过实战项目加深理解。通过不断练习和实践,学员们将能熟练运用hibernate进行数据库操作,提高开发效率。

    hibernate培训第二天

    【hibernate培训第二天】——深入理解Hibernate框架 ...在“达内hibernate培训笔记”的Day2中,学员们将通过深入学习这些知识点,逐步掌握Hibernate的核心技术和使用技巧,为后续的项目开发打下坚实的基础。

Global site tag (gtag.js) - Google Analytics