记录的都是自己在学习是记录的笔记、方便以后查看。
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 }
学习不能停、一旦停下来便前功尽弃。加油吧菜鸟。。。。