zoukankan      html  css  js  c++  java
  • 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 }

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

    文章未经版主同意不可任意转载,如有需要请标明文章出处。
  • 相关阅读:
    错误
    分页查询
    异步请求jquery
    深入理解C/C++ [Deep C (and C++)]
    C语言经典算法100例(三)
    《Python》 计算机基础
    Python程序员的进化史
    以前没有写笔记的习惯,现在慢慢的发现及时总结是多么的重要。 这一篇文章主要关于java多线程一些常见的疑惑点。因为讲解多线程的书籍和文章已经很多了,所以我也不好意思多说,嘻嘻嘻、大家可以去参考一些那些书籍。我这个文章主要关于实际的一些问题。同时也算是我以后复习的资料吧,。还请大家多多指教。 同时希望多结交一些技术上的朋友。谢谢。
    快速读入函数
    一元二次方程公式
  • 原文地址:https://www.cnblogs.com/qihangzj/p/7985516.html
Copyright © 2011-2022 走看看