`
hz_chenwenbiao
  • 浏览: 1007902 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

HibernateTemplate的常用方法--转载 get/load 方法区别

阅读更多

HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring 2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。下面是HibernateTemplate的常用方法简介:

      void delete(Object entity):删除指定持久化实例

      deleteAll(Collection entities):删除集合内全部持久化类实例

      find(String queryString):根据HQL查询字符串来返回实例集合

      findByNamedQuery(String queryName):根据命名查询返回实例集合

      get(Class entityClass, Serializable id):根据主键加载特定持久化类的实例

      save(Object entity):保存新的实例

      saveOrUpdate(Object entity):根据实例状态,选择保存或者更新

      update(Object entity):更新实例的状态,要求entity是持久状态

      setMaxResults(int maxResults):设置分页的大小

下面是一个完整DAO类的源代码:

public class PersonDAOHibernate implements PersonDAO
{
    //采用log4j来完成调试时的日志功能
private static Log log = LogFactory.getLog(NewsDAOHibernate.class);
    //以私有的成员变量来保存SessionFactory。
private SessionFactory sessionFactory;
//以私有变量的方式保存HibernateTemplate
private HibernateTemplate hibernateTemplate = null;
         //设值注入SessionFactory必需的setter方法
    public void setSessionFactory(SessionFactory sessionFactory)
{
           this.sessionFactory = sessionFactory;
    }

         //初始化本DAO所需的HibernateTemplate

public HIbernateTemplate getHibernateTemplate()

{
         //首先,检查原来的hibernateTemplate实例是否还存在
         if ( hibernateTemplate == null)
         {
                   //如果不存在,新建一个HibernateTemplate实例
                   hibernateTemplate = new HibernateTemplate(sessionFactory);
         }
         return hibernateTemplate;
}

         //返回全部的人的实例
    public List getPersons()
         {        
                   //通过HibernateTemplate的find方法返回Person的全部实例
           return getHibernateTemplate().find("from Person");
    }

        
    public void savePerson(Person person)
         {                 
                   getHibernateTemplate().saveOrUpdate(person);
    }

         /**
          * @ param personid 需要删除Person实例的主键
          * /
    public void removePerson(int personid)
         {
                   //先加载特定实例
           Object p = getHibernateTemplate().load(Person.class, new Integer(personid));
                   //删除特定实例
           getHibernateTemplate().delete(p);
    }
 

二、get()与load()方法区别
hibernate中get方法和load方法的根本区别
如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常ObjectNotFoundException,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。

对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。

前面已经讲了,get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

 

载自:http://blog.myspace.cn/e/408783204.htm

分享到:
评论

相关推荐

    hibernateTemplate的常用方法

    ### hibernateTemplate的常用方法详解 #### 概述 `HibernateTemplate`是Spring框架中用于操作Hibernate的一个便捷工具类,它极大地简化了Hibernate在实际应用中的集成与开发工作。通过`HibernateTemplate`,开发者...

    HibernateTemplate的用法总结

    在HibernateTemplate中,提供了多种常用的方法来实现数据访问操作(CRUD): 1. **`void delete(Object entity)`**:用于删除一个指定的对象实例。例如,如果要删除一个`Person`对象,可以直接调用此方法。 2. **`...

    springmvc基础框架

    <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` 在`spring-mvc-servlet....

    hibernateTemplate

    ### HibernateTemplate概述与核心功能详解 #### 一、引言 在Java开发领域,特别是企业级应用开发中,数据持久层的设计与实现至关重要。Hibernate作为一款优秀的对象关系映射(ORM)框架,极大地简化了Java应用程序...

    HibernateTemplate源代码

    - **get**/`load`:根据主键获取对象。 - **saveOrUpdate**:保存或更新对象。 - **delete**:删除对象。 #### 六、使用示例 下面是一个简单的使用示例: ```java // 创建HibernateTemplate实例 ...

    maven搭建项目:springmvc+hibernate

    <load-on-startup>1</load-on-startup> </servlet> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> ``` 然后在`src/main/webapp/WEB-INF/spring/...

    SSH2增删改查使用HibernateTemplate

    此外,HibernateTemplate还提供了`load()`、`execute()`等方法,以适应不同的业务需求。在实际开发中,为了事务的一致性,通常会将这些操作包裹在`@Transactional`注解的方法中,确保数据库操作的原子性和一致性。 ...

    ssh(structs,spring,hibernate)框架中的上传下载

    HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的数据操作方法,如execute(HibernateCallback action),load(Class entityClass, Serializable id),save(final ...

    Spring整合hibernate(2)之基于HibernateTemplate的整合

    return hibernateTemplate.loadAll(User.class); } ``` 保存或更新: ```java public void saveOrUpdate(User user) { hibernateTemplate.saveOrUpdate(user); } ``` 删除: ```java public void deleteUser...

    Spring_Spring_Hibernate_HibernateTemplate

    - 编写业务逻辑:调用HibernateTemplate提供的方法,如`save()`, `update()`, `delete()`, `get()`, `load()`, `execute()`等,进行数据库操作。 6. **优点与局限性**: HibernateTemplate简化了代码,提供了事务...

    hibernateTemplate和HibernateDaoSupport

    hibernateTemplate 和 HibernateDaoSupport 是 Spring 框架中针对 Hibernate 数据库访问层的两个重要组件,它们简化了基于 Hibernate 的数据操作,使得开发者能够更高效地进行 CRUD(创建、读取、更新、删除)操作。...

    对hibernate的封装 HibernateTemplate

    5. **查询和结果集处理**:提供了丰富的查询方法,如`find()`, `load()`, `get()`等,以及方便的结果集转换和分页功能。 6. **Callback机制**:通过HibernateCallback接口,可以在Hibernate Session内部执行自定义...

    Spring配置详解.docx

    `HibernateTemplate`被注入了`sessionFactory`,以便它能利用Session工厂执行操作,如`load()`, `get()`, `save()`, `delete()`等。 下一步是配置DAO(Data Access Object),这里是`userDAO`: ```xml ...

    Hibernate方法总结

    这是最常用的方法,避免了在保存或更新前检查对象是否已存在的步骤。 4. `delete`: 删除指定的对象,对象必须已被持久化。 D. `bulkUpdate`: 批量操作,如批量删除或更新。例如,`bulkUpdate`方法可以直接执行SQL...

    Hibernate的Template方法以及SQL简介

    #### 一、`HibernateTemplate`的常用方法简介 `HibernateTemplate`提供了多种用于操作持久化对象的方法,这些方法可以分为几大类:数据插入、数据更新、数据删除、数据查询等。接下来将详细介绍其中的几种核心方法...

    applicationContext.xml用法

    这样,开发人员就可以利用`HibernateTemplate`提供的便捷方法来执行数据库操作,如`load()`、`get()`、`save()`、`delete()`等。 #### 六、DAO与Service配置 在MVC架构中,DAO层负责数据访问,Service层则负责业务...

    Spring整合Hibernate

    这两个类为Spring提供了便捷的Hibernate操作接口,封装了Session的常用方法,比如save、update、delete和load等。例如: ```xml <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5....

    Spring整合hibernate的实例

    - HibernateTemplate提供了如save(), update(), delete(), get()和load()等方法,以及基于HQL(Hibernate Query Language)的queryForList()等方法。 3. **DAO(数据访问对象)设计**: - Spring鼓励使用DAO接口...

    HibernateDaoSupport.docx

    接下来,我们看看HibernateDaoSupport提供的一些常用方法: 1. `save()`:此方法用于添加新的记录。它调用HibernateTemplate的`save()`方法,将对象持久化到数据库中。 2. `update()`:这个方法用于更新已有记录。...

Global site tag (gtag.js) - Google Analytics