hibernate框架(三)持久化类&主键生成策略

一 持久化类的一个编写规则

持久化:将内存中的一个对象持久化到数据库中的过程
持久化类:一个Java对象与数据库的表创建了映射关系,那么这个类在hibernate中称为持久化类
能够这么理解:持久化类=Java类+映射文件mysql

持久化类的编写规则
1 对持久化类提供一个无参的构造方法
2 属性须要私有,对私有属性提供get和set方法
3 对持久化类提供一个惟一标识Oid与数据库中主键对应
4 持久化类中属性尽可能使用包装类类型
5 持久化类不要使用final进行修饰sql


 

二 主键生成策略

先介绍一下主键的分类:天然主键和代理主键
天然主键:主键的自己就是表中的一个字段(试题中的一个具体的属性 身份证号)
代理主键:主键的自己不是表中必须的一个字段(不是实体中某个具体的属性)
在实际开发中,尽可能使用代理主键
为何不推荐使用天然主键,由于一旦天然主键参与到业务逻辑中,后期可能修改源代码
好的程序设计知足OCP原则:对程序的扩展是open的。对修改源代码是close的数据库


 

主键生成策略(记住):
increment hibernate中提供的自动增加机制,单线程可使用,多线程不能够
identity 使用的是数据库底层的自动增加机制(适用于MySQL SQL server,可是Oracle不适合)
sequence 采用的是序列的方式(适用于Oracle,MySQL就不适用)】
uuid 适用于字符串类型的主键
native 本地策略 ,能够在identity和sequence之间进行自动转换
assigned hibernate放弃外键的管理编程

结合不一样的状况去使用
编程中遇到的问题
没有写自动生成语句的配置 ,致使hibernate不能为你建立表缓存

<property name="hibernate.hbm2ddl.auto">update</property>

三 持久化类的三种状态

hibernate是持久层框架,经过持久化类完成ORM操做。Hibernate为了更好的管理持久化类
将其分为三种:瞬时态、持久态、托管态
瞬时态:这种对象没有惟一的标识OID,没有被session管理
持久态:这种对象有惟一标识OID,被session管理
托管态:这种对象有惟一标识OID,没有被session管理
下面代码演示:这段程序包含了持久化的三种状态session

public class TestDemo2 { @Test public void demo1(){ Session session = HibernateUtils.openSession(); Transaction beginTransaction = session.beginTransaction(); Customer customer=new Customer(); customer.setCust_name("王六");//瞬时态对象。没有惟一标识的OID,没有session管理 
 Serializable id = session.save(customer);//持久态对象。有了惟一标识的OID,调用了session
 beginTransaction.commit(); session.close(); System.out.println(customer.getCust_name());//托管态对象。有惟一标识的OID,session被销毁了
 } }

 


咱们重点研究的是持久态对象,
持久化类的持久态对象,能够自动更新数据库。多线程

@Test //持久态对象自动更新数据库
    public void demo2(){ Session session = HibernateUtils.openSession(); Transaction beginTransaction = session.beginTransaction(); //得到持久态对象
        Customer customer = session.get(Customer.class, 1l); customer.setCust_name("小红"); beginTransaction.commit(); session.close(); }

咱们能够看出并手动调用update方法,Hibernate就能够自动更新数据库了,持久态之因此有这样的功能主要依赖于他的一级缓存oracle

4、Hibernate的一级缓存

什么是缓存:是一种优化的方式,将数据存放到内存中,使用的时候直接从缓存中去取
优化手段:缓存、抓取策略
一级缓存称为是session级别的缓存,生命周期和session一致。框架

5、Hibernate的事务控制


事务:指的是逻辑上的一组操做,组成这组操做的逻辑单元要么所有成功,要么所有失败
事务的四个特性:原子性、一致性、隔离性、持久性ide

  • Read Uncommitted(1级)
  • Read committed(2级)
  • Repeatable read(4级)
  • Serializable 序列化(8级)

实际开发中,不会选择最高或者最低隔离级别,选择Read committed(oracle默认),Repeatable read(mysql默认)。

 


 

Hibernate解决service的事务管理

1.在工具类中更改getCurrentSession方法

public static Session getCurrentSession(){ return sessionFactory.getCurrentSession(); }

2.在核心配置文件中进行以下配置

  <!-- 配置session绑定当前线程 -->
   <property name="hibernate.current_session_context_class">thread</property>

6、Hibernate中其余的API

1.Query

     //条件查询
        String hql="from Customer where cust_name like ?"; Query createQuery = session.createQuery(hql); createQuery.setParameter(0, "王%");
     //分页查询
        String hql="from Customer"; Query createQuery = session.createQuery(hql); createQuery.setFirstResult(0); createQuery.setMaxResults(2);

2.Criteria

//分页查询
        Criteria criteria = session.createCriteria(Customer.class); criteria.setFirstResult(3); criteria.setMaxResults(2);

Criteria更加的面向对象。

相关文章
相关标签/搜索