首页 > 代码库 > 一、Hibernate基础

一、Hibernate基础

1、工作原理-ORM
  读取并解析hibernate.cfg.xml配置文件
  由hibernate.cfg.xml中的<mapping resource="com/**/*.hbm.xml"/>读取并解析映射信息
  创建SessionFactory
  打开Sesssion
  创建事务Transation
  持久化操作
  提交事务
  关闭Session
  关闭SesstionFactory
2、增删改查
  session.save(object);
  session.delete(object);
  session.update(object);
  session.createQuery("from class").list();
3、主键生成方式
  identity 用于自动生成主键,除oracle不支持,其他数据库一般都支持
  sequence 用序列生成主键,Oracle使用
  native 根据配置文件hibernate.cfg.xml中方言来选择生成主键
    注意:native的时候加上<param name="sequence">foo_seq</param>,MySQL不起作用不会报错,Oracle就起作用
  increment 不常用
  assigned 不常用,手动生成id
4、映射类型

Hibernate映射类型 Java类型  标准SQL类型 大  小 描述
integer Integer/int INTEGER 4字节  
double Double/double DOUBLE 8字节  
big_decimal  Bigdecimal NUMERIC    
String java.lang.String VARCHAR    
boolean/yes_no/true_false Boolean/boolean BIT   布尔类型
date java.util.Date/java.sql.Date DATE   yyyy-MM-dd
time java.util.Date/java.sql.Time TIME   hh:mi:ss
timestamp java.util.Date/java.sql.Timestamp TIMESTAMP   yyyymmddhhmiss

 

 

 

 

 

 

 

5、对象三种状态

  暂时态
    当对象刚创建,未经过session操作,当程序执行完就会立即消失
  持久态
    对象经过session操作,如执行save,get,query等操作
    session会缓存该对象
    session再获取对象时,首先去查找一级缓存,如果没有才查询数据库
    session负责将持久态对象的变化更新到数据库中
  游离态
    调用session.evict(Object)方法和session解除关系
6、一级缓存
  
session级的缓存也叫事务级的缓存,只缓存实体,生命周期和session一致
 
 session负责实时维护缓存中的数据,保证缓存中的数据与数据库中的数据的一致性,一旦用户对缓存的数据进行了修改,session立即将数据更新到数据库中
7、延迟加载
  常见延迟加载的方法:load() iterator()
  为了使项目在页面加载完后关闭session,使用ThreadLocal实现OpenSessionInView技术实现页面加载前后调用同一个session,两种方式
    a Hibernateutil中自己管理维护ThreadLocal类(推荐)

 1 import org.hibernate.Session;
 2 import org.hibernate.SessionFactory;
 3 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 4 import org.hibernate.cfg.Configuration;
 5 
 6 public class HibernateUtil {
 7     private static ThreadLocal<Session> tl = new ThreadLocal<Session>();
 8     private static Configuration conf;
 9     private static SessionFactory factory;
10     static {
11       conf = new Configuration().configure();
12       factory = conf.buildSessionFactory(new StandardServiceRegistryBuilder()
13               .applySettings(conf.getProperties()).build());
14     }
15 
16     public static Session openSession() {
17       Session session = tl.get();
18       if (session == null) {
19           session = factory.openSession();
20           tl.set(session);
21       }
22       return session;
23     }
24 
25     public static void closeSession() {
26       Session session = tl.get();
27       if (session != null) {
28           session.close();
29           tl.set(null);
30       }
31     }
32 }

    b 修改hibernate.cfg.xml
      在配置文件中加入一句话,告诉 Hibernate 要使用 ThreadLocal 的方式获得 session
      <property name="current_session_context_class">thread</property>

      HibernateUtil写法如下

 1 import org.hibernate.Session;
 2 import org.hibernate.SessionFactory;
 3 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 4 import org.hibernate.cfg.Configuration;
 5 
 6 public class HibernateUtil {
 7     private static Configuration conf;
 8     private static SessionFactory factory;
 9     static {
10         conf = new Configuration().configure();
11         factory = conf.buildSessionFactory(new StandardServiceRegistryBuilder()
12                         .applySettings(conf.getProperties()).build());
13     }
14 
15     public static Session openSession() {
16         return factory.getCurrentSession();
17     }
18 
19     public static void closeSession() {
20         Session session = factory.getCurrentSession();
21         if (session != null) {
22             session.close();
23         }
24     }
25 }