Hibernate中Session对象方法详解

Hibernate中Session对象方法详解:

  1. flush()
  2. refresh(obj)
  3. clear()
  4. save(obj)
  5. persist(obj)
  6. get() 与 load()
  7. update(obj)
  8. saveOrUpdate()
  9. delete()
  10. evict(obj)

首先是测试类:

public class HibernateTest {
    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;

    @Before
    public void init() {
        sessionFactory = null;
            Configuration configuration = new Configuration().configure();
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                .applySettings(configuration.getProperties())
                .buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
    }   

    @After
    public void distroy() {
        transaction.commit();

        session.close();

        sessionFactory.close();
    }       


}

下面是Session对象方法的详细说明 :

flush()

    @Test
    public void test8(){
        /** * session.flush() : * 当session缓存中的数据发生更改时, * 并且session缓存中的数据与数据库中的数据不一致时, * 更改数据库的数据 * 注意事项 : * flush()会发送SQL语句更改数据库,但并不会提交事务, * 数据库数据不会发生改变 * 调用时机 : * 进行数据库查询时,会先调用flush(),以得到最新记录 * 如果ID是自增的,调用save()时, * 会调用flush()立即发送SQL语句,以保证ID是存在的 */


        Customer customer = (Customer) session.load(Customer.class,1);
        //此时customer.customerName为"数据库更新之前"
        System.out.println(customer);
        customer.setCustomerName("数据库更新之后");
        session.flush();
        //此时customer.customerName为"数据库更新之后"
        //但是数据库的customerName依然为数据库更新之前,没改变
        System.out.println(customer);

    }

refresh(obj)

    @Test
    public void test9(){
        /** * session.refresh(obj) 更新缓存对象 * 当数据库的数据与Session缓存不符时, * 会将Session缓存的对象刷新为最新数据 * 更改的是Session里的对象数据 * 注意事项: refresh()后,对象会添加入Session缓存中 * 需要在hibernate中配置事务隔离级别 * */

        Customer customer = (Customer) session.get(Customer.class,1);
        //此时customer.customerName为"数据库更新之前"
        System.out.println(customer.getCustomerName());
        //添加断点,此时手动更改数据库customerName为数据库更新之后
        customer.setCustomerName("数据库更新之后");
        session.refresh(customer);
        //此时customer.customerName为"数据库更新之前"
        System.out.println(customer);
        System.out.println("测试完毕");


    }

clear()

    @Test
    public void test10(){
        /** * session.clear() : * 删除session的缓存对象,但不会删除对应的数据库数据 * */

        Customer customer = (Customer) session.get(Customer.class,2);
        Order order = (Order) session.get(Order.class,2);
        //清空Session所有缓存
        session.clear();
        Customer customer1 = (Customer) session.get(Customer.class,2);
        Order order1 = (Order) session.get(Order.class,2);
        //此时发送了四条查询语句,说明没有拿session的缓存对象,
        //证明session.clear()生效
        //再次查询Customer与Order时再次发送查询语句
    }

save(obj)

    @Test
    public void test11(){
        /** * session.save(obj) * 将一个临时对象转换为持久化对象,在flush()时会发送一条insert语句 * 注意事项 : * 在调用save()之前,对对象setId()是无效的 * 在调用save()之后,对对象setId()对抛出异常 * */
        Customer customer = new Customer();
        customer.setCustomerName("sss");
        //设置ID无效
        //customer.setCustomerId(100);
        session.save(customer);
        //设置ID抛异常
        //customer.setCustomerId(100);
    }

persist(obj)

    @Test
    public void test12(){
        /** * session.persist(obj) * 将一个临时对象转换为持久化对象,在flush()时会发送一条insert语句 * 与save()的不同点: * 在persist()与之后都不能对对象设置ID,否则抛出异常 * */
        Customer customer = new Customer();
        customer.setCustomerName("ss");
        //设置ID抛异常
        //customer.setCustomerId(100);
        session.persist(customer);
        //设置ID抛异常
        //customer.setCustomerId(100);
    }

get() 与 load()

    @Test
    public void test13(){
        /** * get() 与 load() : * 向数据库查询指定ID的记录 * * 注意事项 : * 1 : get()为立即检索 * load()为延迟检索,返回代理对象 * 2 : 如果数据库没有对应ID,且session没有释放资源 * get()返回null * load()返回的对象在使用时会抛出异常 * 3 : load()之后,如果session释放资源, * 再次调用load()返回的对象会抛出异常 * * */
        //ID:333在数据库中并不存在
        Customer customer1 = (Customer) session.get(Customer.class,333);
        Customer customer2 = (Customer) session.load(Customer.class,333);
        /***********************************************************/
        //返回null
        //System.out.println(customer1);
        /***********************************************************/
        //抛出异常
        //System.out.println(customer2.getCustomerName());
        /***********************************************************/
        //session.close();
        //关闭session后调用customer2抛出异常
        //System.out.println(customer2.getCustomerName());
    }

update(obj)

    @Test
    public void test14(){
        /** * session.update(obj) ; * 更新数据库,使当前对象数据与数据库一致,也会将游离对象 * 转化为持久化对象 * * 注意事项 : * 1 : 一般情况下,不需要显示调用update(),因为后面会提交事务, * 提交事务时会更新数据库 * 2 : 当get()出对象后,释放了session,此时对get()出的对象 * 进行任何set操作都是无效的,要想将set后的数据更新到数据库, * 需要调用update() * 3 : 如果session中有两个有两个相同ID的对象, * 那么在update()时会抛出异常 * */
        /************************************************************/
        /*Customer customer = (Customer) session.get(Customer.class,3); //关闭 transaction.commit(); session.close(); //重新开启session session = sessionFactory.openSession(); transaction = session.beginTransaction(); //设置name值 customer.setCustomerName("sss"); //显示调用更新 session.update(customer);*/

        /************************************************************/
        Customer customer = (Customer) session.get(Customer.class,3);
        //关闭
        transaction.commit();
        session.close();

        //重新开启session
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
        //设置name值
        customer.setCustomerName("sss");
        //此时session中存在了两个相同ID的对象
        Customer customer1 = (Customer) session.get(Customer.class,3);
        //抛出异常
        session.update(customer);
    }

saveOrUpdate()

    @Test
    public void test15(){
        /** * session.saveOrUpdate() 保存或更新 * 注意事项 : 一般根据对象是否存在ID来判断是进行更新或保存 * */
        Customer customer1 = (Customer) session.get(Customer.class,3);
        customer1.setCustomerName("ss");
        //调用的是update
        session.saveOrUpdate(customer1);

        Customer customer2 = new Customer();
        //调用的是save
        session.saveOrUpdate(customer2);
    }

delete()

    @Test
    public void test16(){
        /** * session.delete() : * 将一个对象记录在数据库中删除 * 注意事项 : * 1 : 当执行delete()后,在没有提交事务之前, * 不能对对象进行save和update了,因为delete()后对象的ID * 依旧存在,所以不能save,且delete()后默认为真的删除, * 所以不能update() * 2 : 游离对象与持久化对象都能删除 * 3 : 如果对象ID在数据库不存在,delete()抛异常 * */

        /***********************************************************/
        //ID不存在,删除抛异常
        //Customer customer = (Customer) session.get(Customer.class,333);
        //session.delete(customer);

        /***********************************************************/
        /*Order order = (Order) session.get(Order.class,1); //关闭 transaction.commit(); session.close(); //重新开启session session = sessionFactory.openSession(); transaction = session.beginTransaction(); //删除游离对象 session.delete(order);*/
    }

evict(obj)

    @Test
    public void test17(){
        /** * session.evict(obj) * 将某对象从session缓存中删除 * 但不会删除对应的数据库记录 * */

        Order order1 = (Order) session.get(Order.class,2);
        //移除
        session.evict(order1);
        //一共发送了两次查询语句,说明order1已经被移除,在缓存中不存在了
        Order order2 = (Order) session.get(Order.class,2);

    }

你可能感兴趣的:(spring,mysql,Hibernate,mybatis,javaweb)