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`是Spring框架中用于操作Hibernate的一个便捷工具类,它极大地简化了Hibernate在实际应用中的集成与开发工作。通过`HibernateTemplate`,开发者...
在HibernateTemplate中,提供了多种常用的方法来实现数据访问操作(CRUD): 1. **`void delete(Object entity)`**:用于删除一个指定的对象实例。例如,如果要删除一个`Person`对象,可以直接调用此方法。 2. **`...
<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概述与核心功能详解 #### 一、引言 在Java开发领域,特别是企业级应用开发中,数据持久层的设计与实现至关重要。Hibernate作为一款优秀的对象关系映射(ORM)框架,极大地简化了Java应用程序...
- **get**/`load`:根据主键获取对象。 - **saveOrUpdate**:保存或更新对象。 - **delete**:删除对象。 #### 六、使用示例 下面是一个简单的使用示例: ```java // 创建HibernateTemplate实例 ...
<load-on-startup>1</load-on-startup> </servlet> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> ``` 然后在`src/main/webapp/WEB-INF/spring/...
此外,HibernateTemplate还提供了`load()`、`execute()`等方法,以适应不同的业务需求。在实际开发中,为了事务的一致性,通常会将这些操作包裹在`@Transactional`注解的方法中,确保数据库操作的原子性和一致性。 ...
HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的数据操作方法,如execute(HibernateCallback action),load(Class entityClass, Serializable id),save(final ...
return hibernateTemplate.loadAll(User.class); } ``` 保存或更新: ```java public void saveOrUpdate(User user) { hibernateTemplate.saveOrUpdate(user); } ``` 删除: ```java public void deleteUser...
- 编写业务逻辑:调用HibernateTemplate提供的方法,如`save()`, `update()`, `delete()`, `get()`, `load()`, `execute()`等,进行数据库操作。 6. **优点与局限性**: HibernateTemplate简化了代码,提供了事务...
hibernateTemplate 和 HibernateDaoSupport 是 Spring 框架中针对 Hibernate 数据库访问层的两个重要组件,它们简化了基于 Hibernate 的数据操作,使得开发者能够更高效地进行 CRUD(创建、读取、更新、删除)操作。...
5. **查询和结果集处理**:提供了丰富的查询方法,如`find()`, `load()`, `get()`等,以及方便的结果集转换和分页功能。 6. **Callback机制**:通过HibernateCallback接口,可以在Hibernate Session内部执行自定义...
`HibernateTemplate`被注入了`sessionFactory`,以便它能利用Session工厂执行操作,如`load()`, `get()`, `save()`, `delete()`等。 下一步是配置DAO(Data Access Object),这里是`userDAO`: ```xml ...
这是最常用的方法,避免了在保存或更新前检查对象是否已存在的步骤。 4. `delete`: 删除指定的对象,对象必须已被持久化。 D. `bulkUpdate`: 批量操作,如批量删除或更新。例如,`bulkUpdate`方法可以直接执行SQL...
#### 一、`HibernateTemplate`的常用方法简介 `HibernateTemplate`提供了多种用于操作持久化对象的方法,这些方法可以分为几大类:数据插入、数据更新、数据删除、数据查询等。接下来将详细介绍其中的几种核心方法...
这样,开发人员就可以利用`HibernateTemplate`提供的便捷方法来执行数据库操作,如`load()`、`get()`、`save()`、`delete()`等。 #### 六、DAO与Service配置 在MVC架构中,DAO层负责数据访问,Service层则负责业务...
这两个类为Spring提供了便捷的Hibernate操作接口,封装了Session的常用方法,比如save、update、delete和load等。例如: ```xml <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5....
- HibernateTemplate提供了如save(), update(), delete(), get()和load()等方法,以及基于HQL(Hibernate Query Language)的queryForList()等方法。 3. **DAO(数据访问对象)设计**: - Spring鼓励使用DAO接口...
接下来,我们看看HibernateDaoSupport提供的一些常用方法: 1. `save()`:此方法用于添加新的记录。它调用HibernateTemplate的`save()`方法,将对象持久化到数据库中。 2. `update()`:这个方法用于更新已有记录。...