• Hibernate Session概述


    记录的都是自己在学习是记录的笔记、方便以后查看。

      1 package com.hibernate.entites;
      2 
      3 import java.util.Date;
      4 
      5 import org.hibernate.Session;
      6 import org.hibernate.SessionFactory;
      7 import org.hibernate.Transaction;
      8 import org.hibernate.cfg.Configuration;
      9 import org.hibernate.service.ServiceRegistry;
     10 import org.hibernate.service.ServiceRegistryBuilder;
     11 import org.junit.After;
     12 import org.junit.Before;
     13 import org.junit.Test;
     14 
     15 public class hibernateTest {
     16     
     17     private SessionFactory sessionfactory;
     18     private Session session;
     19     private Transaction transaction;
     20     
     21     @Before
     22     public void init(){
     23         Configuration config = new Configuration().configure();
     24         ServiceRegistry serviceRegistry =
     25                 new ServiceRegistryBuilder().applySettings(config.getProperties())
     26                                             .buildServiceRegistry();
     27         sessionfactory = config.buildSessionFactory(serviceRegistry);
     28         session = sessionfactory.openSession();
     29         transaction = session.beginTransaction();
     30     }
     31     
     32     @After
     33     public void destroy() {
     34         transaction.commit();
     35         session.close();
     36         sessionfactory.close();
     37     }
     38     /**
     39      * clear(): 清空当前 Session 缓存中的 对象.
     40      */
     41     @SuppressWarnings("unused")
     42     @Test
     43     public void testClear(){
     44         News news1 = (News) session.get(News.class, 1);
     45         session.clear();
     46         News news2 = (News) session.get(News.class, 1);
     47     }
     48     
     49     /**
     50      *  update :
     51      *  1. 若更新一个持久化对象, 不需要显示的调用 update 方法. 因为在调用 Transaction 的 commit 方法 时, 会先执行 session 的 flush 方法
     52      *  
     53      *  2. 更新一个游离对象, 需要显示的调用 update方法. 把一个游离对象变成持久化对象
     54      *  
     55      *  注意:
     56      *  1. 无论要更新的游离对象和数据表的记录是否一致, 都会执行 UPDATE 语句
     57      *      如何能让 update 方法 不盲目的执行 update语句呢? 在 .hbm.xml 文件的 class 节点设置 select_before-update=true
     58      */
     59     @Test
     60     public void testUpdate(){
     61         News news = (News) session.get(News.class, 1);
     62         transaction.commit();
     63         session.close();
     64         session = sessionfactory.openSession();
     65         transaction = session.beginTransaction();
     66         news.setAuthor("FBI");
     67         session.update(news);
     68     }
     69     
     70     /**
     71      * get VS load
     72      * 1. 执行 get 方法: 会立即加载对象. 而执行 load方法, 则不会立即执行查询操作, 而是返回一个代理对象
     73      * 
     74      *     get 是立即检索     load 是延迟检索
     75      * 
     76      * 2. load 方法可能会抛出  LazyInitializationException 异常 : 在需要初始化代理对象之前已经关闭了 Session
     77      * 
     78      * 3. 若数据表中没有对应的记录 且 Session 也没有关闭.
     79      *  get 返回 null
     80      *  load 若不使用该对象的任何属性,没问题。若需要初始化了,  抛出异常.
     81      *  
     82      */
     83     @Test
     84     public void testLoad(){
     85         News news = (News) session.load(News.class, 1);
     86         System.out.println(news.getClass().getName());
     87         System.out.println(news);
     88     }
     89     
     90     @Test
     91     public void testGet(){
     92         News news = (News) session.get(News.class, 1);
     93         System.out.println(news);
     94     }
     95     
     96     /**
     97      * persist()方法 : 也会执行 INSERT 语句
     98      * 
     99      * 与 save() 区别:
    100      * 在调用 persist 方法之前, 若对象已经有id , 则不会执行 INSERT 语句 而是抛出异常.
    101      */
    102     @Test
    103     public void testPersist(){
    104         News news = new News();
    105         news.setTitle("BB");
    106         news.setAuthor("bb");
    107         news.setDate(new Date());
    108         System.out.println(news);
    109         session.persist(news);
    110         System.out.println(news);
    111     }
    112     /**
    113      * 1. save()方法
    114      * 1). 是一个临时对象成为一个持久化对象
    115      * 2). 为对象分配 ID
    116      * 3). 在 flush 缓存 时会发送一条 INSERT 语句
    117      * 4). 在 save 之前的 id 是无效的
    118      * 5). 持久化对象的 ID 是不能被修改的!
    119      */ 
    120     @Test
    121     public void testSave(){
    122         News news = new News();
    123         news.setTitle("AA");
    124         news.setAuthor("aa");
    125         news.setDate(new Date());
    126         System.out.println(news);
    127         session.save(news);
    128         System.out.println(news);
    129     }
    130     /**
    131      * refresh: 会强制发送 SELECT 语句, 以使 Session 缓存中的对象状态与数据表中对应的记录保持一致.
    132      */
    133     @Test
    134     public void testRefresh(){
    135         News news = (News) session.get(News.class, 1);
    136         System.out.println(news);
    137         session.refresh(news);
    138         System.out.println(news);
    139     }
    140     /**
    141      * flush: 使数据表中的记录和 session 缓存中的对象的状态保持一致.为了保持一致,则可能会发送对应的 SQL 语句.
    142      * 1. 调用 Transaction 的 commit() 方法中: 先调用 session 的 flush 方法 再提交事务.
    143      * 2. flush 方法 可能会发送 SQL 语句, 但不会提交事务.
    144      * 3. 注意: 在未提交事务或显示调用 session.flush() 方法之前, 也有可能 会进行 flush() 操作.
    145      * 1). 执行 HQL 或 QBC 查询, 会先进行 flush() 操作, 已得到数据表的最新的记录
    146      * 2). 若记录的 ID 是由底层数据库使用自增的方式生成的, 则在调用 save()方法时, 就会立即发送 INSERT 语句.
    147      *         因为 save() 方法后 必须保证对象的 ID 是存在的.
    148      * 
    149      */
    150     @Test
    151     public void testSessionFlush2(){
    152         News news = new News(".Net", "FBI", new Date());
    153         session.save(news);
    154         System.out.println(news);
    155     }
    156     @Test
    157     public void testSessionFlush(){
    158         News news = (News) session.get(News.class, 1);
    159         news.setAuthor("SUN");
    160         
    161         News news2 = (News) session.createCriteria(News.class).uniqueResult();
    162         System.out.println(news2);
    163     }
    164     
    165     @Test
    166     public void testSessionCache() {
    167 
    168         News news = (News) session.get(News.class, 1);
    169         System.out.println(news);
    170         
    171         News news2 = (News) session.get(News.class, 1);
    172         System.out.println(news2);
    173     }
    174 
    175 }

    学习不能停、一旦停下来便前功尽弃。加油吧菜鸟。。。。

    文章未经版主同意不可任意转载,如有需要请标明文章出处。
  • 相关阅读:
    IDL读取TXT文件并写入二维数组中【转】
    远程连接ArcSDE
    Silverlight项目启动出现System.NullReferenceException未将对象引用到对象实例
    ENVI扩展工具:HDF5 Browser
    READF: End of file encountered. Unit: 100
    ENVI4.8下从两幅分类结果的栅格图中计算土地利用类型转换矩阵
    IDL中去掉数组中相同的元素方法
    利用IDL程序自动添加ENVI菜单【转】
    WIN7远程桌面连接知识
    对COM组件的调用返回了错误"HRESULT E_FAIL”的错误分析(c#与IDL混合编程)转
  • 原文地址:https://www.cnblogs.com/qihangzj/p/7985516.html
Copyright © 2020-2023  润新知