主键生成策略
代理主键和自然主键的区别?
代理主键可以称之为逻辑主键,作用主要是区分数据库中的记录,不参与程序业务逻辑
自然主键可以称之为业务主键,不仅区分数据库中的记录还参数程序业务逻辑,一般设计都是有规律的。
名称 | value |
---|---|
native | 选择identity、sequence、hilo三种生成策略之一,适用代理主键 |
identity | 数据库本身提供自增长数据类型,适用于代理主键 |
sequence | hibernate支持数据库生成序列,数据库要支持生成序列,如oracle数据库 |
hilo | 采用高低位算法:high、low适用于代理主键 |
uuid | 采用128位UUID算法生成标识符,编码为32位的十六进制字符串8-4-4-4-12 |
assigned | java程序负责生成标识如果不指定id的generator属性,则默认使用该主键生成策略 |
对象标识符(OID)
OID就是映射配置文件中对应数据库主键的标识
<id name="custId" column="cust_id">
<generator class="native"></generator>
</id>
一级缓存(session缓存)
缓存:内存中的临时数据。
优势:减少和数据库交互的次数,从而提高效率。
适用:经常查询并不经常修改的,数据一旦出现问题,对结果影响不大的
不适用:只要经常修改的不适应,如银行汇率,股市牌价等
session对象就是hibernate的一级缓存,hibernate在执行查询操作时,将数据库查询的结果先放入一级缓存中然后再做处理。一级缓存存储的是查询的实体类对象。
快照机制
hibernate 内存区域起始分为两块,一块是用来存放session对象的一级缓存区域,另一块是快照区,当查询一条记录时,这条记录就被放到一级缓存区域中,然后想要对这条记录更改,则更改前的数据放入了快照区,更改后的数据放入了一级缓存区。最后提交事务时,比较两个区域的数据,如果相同不做更改,不同则保证一级缓存中的数据到数据库中。
hibernate对象的三种状态
瞬时状态:没有OID(对象标识符)和session没有关系;
持久关系:有OID,和session有关系,只有持久化对象的概念,才会有一级缓存;
托管状态:有OID,和session没有关系;
删除状态:有OID,和session有关系,同时调用了删除方法,即将从数据库中删除数据,但事务还没提交,此时对象的状态称删除状态。
/*
* Hibernate对象状态
* */
public class HibernateDemo8 {
@Test
public void test(){
Session s = HibernateUtils.openSession();
Transaction tr = s.beginTransaction();
Customer c = new Customer();//瞬时状态
c.setCustName("XXX");
s.save(c);//持久化状态
tr.commit();
s.close();
c.setCustName("TTT");//托管状态(脱离了session的管理)
}
}