004---持久对象的生命周期介绍(二)

try {

            session = HibernateUtils.getSession();

            session.beginTransaction();

            /*

             * 此时session又对user对象进行管理

             * session发出update指定后,进行更新数据为(张三。)

             */

            session.update(user);

 

            //updateuser对象状态又变为persistent状态

            session.getTransaction().commit();

            /*

             * 此时session提交事务,发出update语句

             * Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?

             */

        } catch (HibernateException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            session.getTransaction().rollback();

        }finally {

            HibernateUtils.closeSession(session);

        }

    }

 

Hibernate加载数据:

         两种:get()load()

一、 Session.get(Class arg0, Serializable arg1)方法

* arg0:需要加载对象的类,例如:User.class

    * arg1:查询条件(实现了序列化接口的对象)

"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

    返回值: 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。

            如果数据不存在,则返回null;

    注:执行此方法时立即发出查询SQL语句。加载User对象

 

加载数据库中存在的数据,代码如下:

try {

            session = sf.openSession();

            session.beginTransaction();

           

            /*

             * Object org.hibernate.Session.get(Class arg0, Serializable arg1) throws HibernateException

             * arg0:需要加载对象的类,例如:User.class

             * arg1:查询条件(实现了序列化接口的对象):例"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

             * 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。

                如果数据不存在,则返回null

             * 执行此方法时立即发出查询SQL语句。加载User对象。

             */

            User user = (User)session.get(User.class, "4028818a245fdd0301245fdd06380001");

           

            //数据加载完后的状态为persistent状态。数据将与数据库同步。

            System.out.println("user.name=" + user.getName());

           

            //因为此的userpersistent状态,所以数据库进行同步为龙哥。

            user.setName("龙哥");

           

            session.getTransaction().commit();

        } catch (HibernateException e) {

            e.printStackTrace();

            session.getTransaction().rollback();

        } finally{

            if (session != null){

                if (session.isOpen()){

                    session.close();

                }

            }

 

 

二、 Object Session.load(Class arg0, Serializable arg1) throws HibernateException

    * arg0:需要加载对象的类,例如:User.class

    * arg1:查询条件(实现了序列化接口的对象):例"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

    * 此方法返回类型为Object,但返回的是代理对象。

    * 执行此方法时不会立即发出查询SQL语句。只有在使用对象时,它才发出查询SQL语句,加载对象。

    * 因为load方法实现了lazy(称为延迟加载、赖加载)

    * 延迟加载:只有真正使用这个对象的时候,才加载(才发出SQL语句)

    * hibernate延迟加载实现原理是代理方式。

    * 采用load()方法加载数据,如果数据库中没有相应的记录,则会抛出异常对象不找到(org.hibernate.ObjectNotFoundException)

    try {

        session = sf.openSession();

        session.beginTransaction();

       

         User user = (User)session.load(User.class, “4028818a245fdd0301245fdd06380001");

           

        //只有在使用对象时,它才发出查询SQL语句,加载对象。

        System.out.println("user.name=" + user.getName());

           

        //因为此的userpersistent状态,所以数据库进行同步为龙哥。

        user.setName("发哥");

           

        session.getTransaction().commit();

    } catch (HibernateException e) {

        e.printStackTrace();

        session.getTransaction().rollback();

    } finally{

            if (session != null){

                if (session.isOpen()){

                    session.close();

                }

            }

    }      

 

Hibernate两种加载数据方式的区别:

    get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载

    get()方法在查询不到数据时,返回null,load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)

   

    get()load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL

 

hibernate更新数据:

建立使用hibernate进行更新数据时,先加载数据,然后再修改后更新。

否则一些字段可以会被null替换。

try {

            session = sf.openSession();

            session.beginTransaction();

           

            //手动构造一个Detaded状态的User

            User user = new User();

            user.setId("4028818a245fdd0301245fdd06380001");

            user.setName("wjt276");

            //Transient状态

         /*

          * 目前这样更新,数据库记录中此条记录,除了idname字段为设置字段,其它均为null,因为对象其它

          * 属性没有设置数据,因为更新数据时要先加载需要更新数据的对象,再修改更新。

          */

            session.update(user);//userpersistent状态

           

            session.getTransaction().commit();

        } catch (HibernateException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            session.getTransaction().rollback();

        } finally{

            if (session != null){

                if (session.isOpen()){

                    session.close();

                }

            }

        }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值