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 把临时状态转变为持久状态(交给session管理) Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------ User user = new User();//临时状态:数据库中没有对应的记录,跟session没有联系 user.setName("test"); session.save(user);//持久状态:在session的管理中最终数据库中会有对应的记录 // session.save(user);//save是立即执行(如果主键是由自己指定的那也是在flush()中执行),delete和update都是默认在flush()执行 // session.save(user);//同一个对象执行多次保存,只会保存一个到session集合,session管理的是同一个对象 // session.save(user); user.setName("贱贱");//持久状态:会自动更新数据库中的内容 //------------------------ tx.commit();//默认调用flush()并执行所有的SQL语句 session.close();//关闭session System.out.println(user);//session关闭之后变为游离状态,数据库中有记录,和session没有联系 user.setName("小贱aaaa");//游离状态修改对象数据库不会更新 } //把游离状态转变为持久状态 //在更新时对象不存在会报错 @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);//持久化状态 user.setName("小san"); // session.flush();//立即执行,更新到数据库 System.out.println("----------------"); // session.clear();//清除session中所有的对象,user变为游离状态 // session.evict(user);//清除session中user,user变为游离状态 // session.update(user);//commit()执行游离状态转变为持久状态 System.out.println("----------------"); //-------------------- tx.commit(); session.close(); } @Test public void testSaveOrUpdate() throws Exception { //把临时游离状态转变为持久状态 //在更新时对象不存在会报错 //本方法是根据id来判断对象是什么状态,如果id是原始值(临时状态)就insert,如果不是原始值(游离状态)就update, Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------ User user = new User();//id原始值 // user.setId(1);//设置了Id,执行update语句,如果数据库中没有就报错 user.setName("张三"); session.saveOrUpdate(user); //-------------------- tx.commit(); session.close(); } @Test public void testDelete() throws Exception { //把持久化和游离状态转化为删除状态 //如果删除的对象不存在抛异常 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(){ //获取对象,持久化状态 //如果对象不存在,返回null //马上执行SQL语句 //返回的是真实对象 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 { //获取数据,是持久化状态 //延时加载,不立即执行SQL语句,而是在使用到除了(User.class, id)才执行SQL语句,用到数据库的数据才加载 //返回的是代理对象 //延时加载的实体类不能是final,否则不能生成子类代理 //如果数据不存在就跑异常objectNotFoundException //让延时加载失效的方式:让实体类写成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());//立即执行SQL语句 //-------------------- tx.commit(); session.close(); } @Test public void testBatchSave() throws Exception { //操作大量数据要防止session中对象过多而内存溢出 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //------------------------ for (int i = 0 ;i<1000 ; ++i){ User user = new User(); user.setName("大数据"); session.save(user); if(i%10 == 0){ session.flush();//先提交 session.clear();//在清空 } } //-------------------- tx.commit(); session.close(); } }
时间: 2024-10-24 13:01:54