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)