import static org.junit.Assert.*;import java.io.FileInputStream;import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.Test;public class App { PRivate SessionFactory sessionFactory = new Configuration() .configure() .addClass(User.class) .buildSessionFactory(); @Test public void testSave() throws Exception{ //save 把臨時(shí)狀態(tài)轉(zhuǎn)變?yōu)槌志脿顟B(tài)(交給session管理) Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------ User user = new User();//臨時(shí)狀態(tài):數(shù)據(jù)庫中沒有對應(yīng)的記錄,跟session沒有聯(lián)系 user.setName("test"); session.save(user);//持久狀態(tài):在session的管理中最終數(shù)據(jù)庫中會(huì)有對應(yīng)的記錄// session.save(user);//save是立即執(zhí)行(如果主鍵是由自己指定的那也是在flush()中執(zhí)行),delete和update都是默認(rèn)在flush()執(zhí)行// session.save(user);//同一個(gè)對象執(zhí)行多次保存,只會(huì)保存一個(gè)到session集合,session管理的是同一個(gè)對象// session.save(user); user.setName("賤賤");//持久狀態(tài):會(huì)自動(dòng)更新數(shù)據(jù)庫中的內(nèi)容 //------------------------ tx.commit();//默認(rèn)調(diào)用flush()并執(zhí)行所有的SQL語句 session.close();//關(guān)閉session System.out.println(user);//session關(guān)閉之后變?yōu)橛坞x狀態(tài),數(shù)據(jù)庫中有記錄,和session沒有聯(lián)系 user.setName("小賤aaaa");//游離狀態(tài)修改對象數(shù)據(jù)庫不會(huì)更新 } //把游離狀態(tài)轉(zhuǎn)變?yōu)槌志脿顟B(tài) //在更新時(shí)對象不存在會(huì)報(bào)錯(cuò) @Test public void testUpadet() throws Exception { Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------ User user = (User) session.get(User.class, 1); System.out.println(user);//持久化狀態(tài) user.setName("小san");// session.flush();//立即執(zhí)行,更新到數(shù)據(jù)庫 System.out.println("----------------"); // session.clear();//清除session中所有的對象,user變?yōu)橛坞x狀態(tài)// session.evict(user);//清除session中user,user變?yōu)橛坞x狀態(tài) // session.update(user);//commit()執(zhí)行游離狀態(tài)轉(zhuǎn)變?yōu)槌志脿顟B(tài) System.out.println("----------------"); //-------------------- tx.commit(); session.close(); } @Test public void testSaveOrUpdate() throws Exception { //把臨時(shí)游離狀態(tài)轉(zhuǎn)變?yōu)槌志脿顟B(tài) //在更新時(shí)對象不存在會(huì)報(bào)錯(cuò) //本方法是根據(jù)id來判斷對象是什么狀態(tài),如果id是原始值(臨時(shí)狀態(tài))就insert,如果不是原始值(游離狀態(tài))就update, Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------ User user = new User();//id原始值// user.setId(1);//設(shè)置了Id,執(zhí)行update語句,如果數(shù)據(jù)庫中沒有就報(bào)錯(cuò) user.setName("張三"); session.saveOrUpdate(user); //-------------------- tx.commit(); session.close(); } @Test public void testDelete() throws Exception { //把持久化和游離狀態(tài)轉(zhuǎn)化為刪除狀態(tài) //如果刪除的對象不存在拋異常 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------// User user = (User) session.get(User.class, 15);// session.delete(user);//刪除持久化對象 User user = new User(); user.setId(16);//模擬游離對象 session.delete(user);//刪除游離對象 //-------------------- tx.commit(); session.close(); } @Test public void testGet(){ //獲取對象,持久化狀態(tài) //如果對象不存在,返回null //馬上執(zhí)行SQL語句 //返回的是真實(shí)對象 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------ User user = (User) session.get(User.class, 1); System.out.println("---------------------"); //------------------------ tx.commit(); session.close(); } @Test public void testLoad() throws Exception { //獲取數(shù)據(jù),是持久化狀態(tài) //延時(shí)加載,不立即執(zhí)行SQL語句,而是在使用到除了(User.class, id)才執(zhí)行SQL語句,用到數(shù)據(jù)庫的數(shù)據(jù)才加載 //返回的是代理對象 //延時(shí)加載的實(shí)體類不能是final,否則不能生成子類代理 //如果數(shù)據(jù)不存在就跑異常objectNotFoundException //讓延時(shí)加載失效的方式:讓實(shí)體類寫成final,或者在**.hbm.xml中配置<class... lazy="false"> Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------ User user = (User) session.load(User.class, 1);//返回的是代理對象 System.out.println(user.getId()); System.out.println(user.getClass()); // System.out.println(user.getName());//立即執(zhí)行SQL語句 //-------------------- tx.commit(); session.close(); } @Test public void testBatchSave() throws Exception { //操作大量數(shù)據(jù)要防止session中對象過多而內(nèi)存溢出 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------ for (int i = 0 ;i<1000 ; ++i){ User user = new User(); user.setName("大數(shù)據(jù)"); session.save(user); if(i%10 == 0){ session.flush();//先提交 session.clear();//在清空 } } //-------------------- tx.commit(); session.close(); } }
新聞熱點(diǎn)
疑難解答
圖片精選