zoukankan      html  css  js  c++  java
  • Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查

    5. Hibernate对数据的增删改查

    5.1Hibernate加载数据

    两种:get()、load()

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

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

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

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

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

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

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

    二、 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)

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

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

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

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


    5.2 hibernate更新数据:

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

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

     1 try {
     2             session = sf.openSession();
     3             session.beginTransaction();
     4             
     5             //手动构造一个Detaded状态的User
     6             User user = new User();
     7             user.setId("4028818a245fdd0301245fdd06380001");
     8             user.setName("wjt276");
     9             //Transient状态
    10          /*
    11           * 目前这样更新,数据库记录中此条记录,除了id、name字段为设置字段,其它均为null,因为对象其它
    12           * 属性没有设置数据,因为更新数据时要先加载需要更新数据的对象,再修改更新。
    13 redjk:以下为猜测的解决方案:
    14 1不使用new的方式取得对象User。 直接写出User u=(User)session.get(User.class,’id’);
    15 2摘录:
    16      有几种方法可以达到此目的:
    17      1、hibernate配置文件,设置不需要更新的字段属性为 update="false";
    18      2、页面采用hidden控件;
    19      3、使用hql的update语句手动更新字段;
    20      4、使用megre方法更新数据(需要配置hibernate配置文件属性dynamic-update="true")。
    21 。。。。。。
    22      页面流程简单的时候,采用第一、二种方法都可以。如果流程多,每一步页面的元素不一样,这时候采用第四种就比较方便。第三种方法很灵活,但不到不得已不喜欢用,手写update,我已经不太习惯了~~
    23           */
    24             session.update(user);//user为persistent状态
    25             
    26             session.getTransaction().commit();
    27         } catch (HibernateException e) {
    28             // TODO Auto-generated catch block
    29             e.printStackTrace();
    30             session.getTransaction().rollback();
    31         } finally{
    32             if (session != null){
    33                 if (session.isOpen()){
    34                     session.close();
    35                 }
    36             }
    37         }

    5.3 hibernate删除数据:

    删除对象,一般先加载上来对象,然后再删除该对象。

    对象删除后,对象状态为Transistent状态。

    演示代码

     1 /**
     2      * hibernate删除对象
     3      */
     4     public void testDelete1(){
     5         Session session = null;
     6         
     7         try {
     8             session = HibernateUtils.getSession();
     9             session.beginTransaction();
    10             
    11             User user = (User)session.load(User.class, "4028818a245fdd0301245fdd06380001");
    12             session.delete(user);
    13             
    14             session.getTransaction().commit();
    15         } catch (HibernateException e) {
    16             e.printStackTrace();
    17             session.getTransaction().rollback();
    18         } finally{
    19             if (session != null){
    20                 if (session.isOpen()){
    21                     session.close();
    22                 }
    23             }
    24         }
    25         //transistent状态(数据库中没有配区的数据记录。)
    26     }

     其他session方法见api。

    相关说明见“

    [转]Hibernate Session各种状态转换方法分析

  • 相关阅读:
    awk 正则匹配指定字段次数统计
    base64图片内容下载转为图片保存
    基于keras的fasttext短文本分类
    ubuntu 更换为mac主题
    ubuntu crontab python 定时任务备记
    ubuntu14.04 安装jdk1.8及以上
    fastext 中文文本分类
    django 多线程下载图片
    中文词向量训练
    mongodb 安装使用备记
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3640529.html
Copyright © 2011-2022 走看看