1. 主要类与接口

Hibernate。Hibernate通过Configuration的实例加载配置文件信息,然后读取指定对象关系映射文件的内容并创建SessionFactory实例。

SessionFactory接口

  负责初始化Hibernate。一个SessionFactory实例对应一个数据库。应用程序从SessionFactory中获得Session实例。

Session接口

   Session被称为持久化管理器,负责管理与持久化相关的操作:存储、更新、删除和加载对象。

Transaction接口

是Hibernate框架的事务接口。它对底层的事务接口做了封装。包括:JDBC API和JTA。

2. Session的缓存(一级缓存)

Session的CRUD方法以及调用查询接口的list(),iterate()方法时,如果session缓存中不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中,如果session缓存中已经存在这个对象,就不需在去数据库加载,而直接使用缓存中的对象。

flush: 进行清理缓存(此时缓存中的数据并不丢失)的操作,让缓存和数据库同步 执行一些列sql语句,但不提交事务,;

commit:先调用flush() 方法,然后提交事务. 则意味着提交事务意味着对数据库操作永久保存下来。  

session的缓存一般交由hibernate框架自动管理。

3. Session的几个主要方法

   1)、save保存数据,相当于insert方法

   2)、delete,删除对象

   3)、update,更新对象,如果数据库中没有记录,会出现异常。

   4)、get,根据ID查,会立刻访问数据库。

   5)、Load,根据ID查,(返回的是代理,不会立即访问数据库)。

   6)、saveOrUpdate (根据ID和version的值来确定是save或update

4.主键id的属性值:取值标示符取值器

心得2-hibernate入门2_缓存

注:native:hibernate自动选择底层数据库;

     increment:由hibernate管理主键,自动以递增的方式生成标识符,每次增量为1。其在每次插入前取得一个当前最大的id+1作为主键,该主键必须为Integer类型;

    sequence:DB2、oracle数据库;

    identity:DB2、mysql、sql service数据库;

     foregin:外键关联,常和one-to-one一块用

 

5. 一个运用hibernate写的增删改查例子

自己手动编写的一个工具类  Hibernate.java

package com.hbsi.utils;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

 

public class HibernateUtil {

   

   private static Session session;

   static{

      Configuration cfg = new Configuration().configure();

      SessionFactory factory = cfg.buildSessionFactory();

      session = factory.openSession();

   }

    public static Session getSession(){

      return session;

    }

    public static void close(){

      if(session!=null){

        session.close();

      }

    }

}

增删改查类 UtilTest.java:

package com.hbsi.test;

 

import java.util.Date;

import java.util.List;

 

import org.hibernate.Query;

import org.hibernate.Session;

import org.junit.Test;

 

import com.hbsi.domain.User;

import com.hbsi.utils.HibernateUtil;

 

public class UtilTest {

   @Test

   public void addUser(){

      

      User user = new User();

      user.setName("lisi");

      user.setBirthday(new Date());

      try{

        Session session = HibernateUtil.getSession();

        session.beginTransaction();

        session.save(user);

        session.getTransaction().commit();

      }catch(Exception e){

        e.printStackTrace();

      }finally{

        HibernateUtil.close();

      }

      

   }

   @Test

   public void deleteUser(){

      try{

        //方法一:先查找,再操作

        /*Session session = HibernateUtil.getSession();

        session.beginTransaction();

        User user = (User)session.get(User.class, 1);

        session.delete(user);

        session.getTransaction().commit();*/

        //方法二:直接new出bean类,然后指明要删除的id

        Session session = HibernateUtil.getSession();

        session.beginTransaction();

        User user = new User();

        user.setId(2);

        session.delete(user);

        session.getTransaction().commit();

      }catch(Exception e){

        e.printStackTrace();

      }finally{

        HibernateUtil.close();

      }

      

   }

   @Test

   public void updateUser(){

      try{

        //方法一:先查找,再操作

        /*Session session = HibernateUtil.getSession();

        session.beginTransaction();

        User user = (User)session.get(User.class, 2);

        user.setName("lisi");

        session.update(user);

        session.getTransaction().commit();*/

        //方法二:直接new出bean类,然后指明要更新的id,这种方法适合删除不适合更新,比如你只更新名字字段,其他的字段就会变成空

        Session session = HibernateUtil.getSession();

        session.beginTransaction();

        User user = new User();

        user.setId(2);

        user.setName("利索");

        session.update(user);

        session.getTransaction().commit();

      }catch(Exception e){

        e.printStackTrace();

      }finally{

        HibernateUtil.close();

      }

      

   }

   //按id查找;get()方法会立刻访问数据库;load()方法返回的是代理,不会立即访问数据库

   @Test

   public void findUser(){

      

      try{

        Session session = HibernateUtil.getSession();

        User user = (User)session.get(User.class, 1);

         System.out.println(user.getId()+"----"+user.getName()+"----"+user.getBirthday());

      }catch(Exception e){

        e.printStackTrace();

      }finally{

        HibernateUtil.close();

      }

   }

   //按id查找,懒加载;之所以说懒,是因为这里的load()方法与上面的get()方法有所不同,前者只有在使用load()方法返回的对象时才去执行sql语句,不使用不执行;而后者不一样,它不管什么时候都执行

   @Test

   public void loadUser(){

      

      try{

        Session session = HibernateUtil.getSession();

        User user = (User)session.load(User.class, 1);

         System.out.println(user.getId()+"----"+user.getName()+"----"+user.getBirthday());

      }catch(Exception e){

        e.printStackTrace();

      }finally{

        HibernateUtil.close();

      }

   }

   //查找所有

   @Test

   public void findAll(){

      

      try{

        Session session = HibernateUtil.getSession();

        Query query = session.createQuery("from User");

        List<User> list = query.list();

        for(User user : list){         

           System.out.println(user.getId()+"----"+user.getName()+"----"+user.getBirthday());

        }

      }catch(Exception e){

        e.printStackTrace();

      }finally{

        HibernateUtil.close();

      }

   }

}