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 }

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

文章未经版主同意不可任意转载,如有需要请标明文章出处。
原文地址:https://www.cnblogs.com/qihangzj/p/7985516.html