zoukankan      html  css  js  c++  java
  • 一、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 }
  • 相关阅读:
    c# 自定义事件和委托
    C#委托之个人理解(转)
    invokeRequired属性和 invoke()方法
    .NET(C#)连接各类数据库
    Mobile Web Development with ASP.NET 2.0
    移动飞信WEB发送服务接口
    4行C#代码打造专业数据库连接配置界面
    domino 中 UniversalID 和NoteID的区别
    VB中preserve的用法
    LOTUS Note ID 剖析
  • 原文地址:https://www.cnblogs.com/tombsky/p/3753109.html
Copyright © 2011-2022 走看看