1、Hibernate基础

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

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

 

 

 

 

 

 

 

五、对象三种状态sql

  暂时态
    当对象刚建立,未通过session操做,当程序执行完就会当即消失
  持久态
    对象通过session操做,如执行save,get,query等操做
    session会缓存该对象
    session再获取对象时,首先去查找一级缓存,若是没有才查询数据库
    session负责将持久态对象的变化更新到数据库中
  游离态
    调用session.evict(Object)方法和session解除关系
六、一级缓存
  
session级的缓存也叫事务级的缓存,只缓存实体,生命周期和session一致
 
 session负责实时维护缓存中的数据,保证缓存中的数据与数据库中的数据的一致性,一旦用户对缓存的数据进行了修改,session当即将数据更新到数据库中
七、延迟加载
  常见延迟加载的方法: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写法以下session

 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 }
相关文章
相关标签/搜索