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);

    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值