Load方法
==================通过实体类的具体类型和标识属性查找指定的记录============
public Object load(Class entityClass, Serializable id) throws DataAccessException {
return load(entityClass, id, null);
}
public Object load(final Class entityClass, final Serializable id, final LockMode lockMode)
throws DataAccessException {
return executeWithNativeSession(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
if (lockMode != null) {
return session.load(entityClass, id, lockMode);
}
else {
return session.load(entityClass, id);
}
}
});
}
===============通过实体类的具体名称和标识属性查找指定的记录================
public Object load(String entityName, Serializable id) throws DataAccessException {
return load(entityName, id, null);
}
public Object load(final String entityName, final Serializable id, final LockMode lockMode)
throws DataAccessException {
return executeWithNativeSession(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
if (lockMode != null) {
return session.load(entityName, id, lockMode);
}
else {
return session.load(entityName, id);
}
}
});}
==========根据实体类的类型查询出所有的记录===============================
public List loadAll(final Class entityClass) throws DataAccessException {
return (List) executeWithNativeSession(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = session.createCriteria(entityClass);
prepareCriteria(criteria);
return criteria.list();
}
});
}
Load的所有方法正如上面所列举的
大家可以看到load和get方法还是很相似的。抛开得到list和void方法不说,在得到单个记录的方法上用法是一样的,不过内部是不同的所以他们还是有很大区别的,所以这里我主要是要对get和load方法做一个比较。
Get和load方法的比较
就我现在的理解,我总结可以分成显性区别和隐性区别
显性区别:
首先,我还是不配置opensessioninview,整合ssh,spring在action中注入业务层的接口(personService),对俩个方法进行测试。
Get方法
记录存在时-----可以成功得到记录。
记录不存在时返回null,
配置opensessioninview效果一样
Load方法
出现异常:
javax.servlet.ServletException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
之后我配置opensessioninview,
记录存在------可以成功得到记录。
记录不存在,出现异常
javax.servlet.ServletException: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [domain.person.Person#2]
隐性区别
相比显性区别,隐性区别就是俩中方法的内部实现方式上的不同
主要的地方:
getHibernateTemplate.load() 存在延迟加载问题。
getHibernateTemplate.get() 不存在此问题,她是不采用lazy机制的。
1 当记录不存在时候,get方法返回null,load方法产生异常,即get()可以取空的数据集,但load()不行。
2 load方法可以返回实体的代理类,get方法则返回真是的实体类
3 load方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据,而get方法仅仅在内部缓存中
进行数据查找,如果没有发现数据則将越过二级缓存,直接调用SQL查询数据库。
4 也许别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,而get则
会返回最新数据。
loadAll方法
我实验的程序中俩个实体间的关系manytoone
首先我先实验”一”这端:
我设置一端,inverse=true 多的一端lazy=proxy,据说manytoone标签默认的lazy属性就是proxy.
不使用opensessioninview一端可以得到记录但是多的一端得不到记录。改为opensessioninview后,俩端都能得到记录。
然后我多端的lazy=false,
不使用opensessioninview,多端无法得到数据。使用opensessioninview后得到数据
关于从‘一’端,使用loadall方法的总结,无论‘多’段是否设置lazy加载,为了得到‘多’端的数据都要配置opensessioninview,才能实现。
然后,我实验再‘多’的一端使用loadAll方法
条件一:多的一端实现lazy=proxy,
条件二:不使用opensessioninview
结果:多的一端数据加载正常,‘一‘端出现异常
条件一:多的一端实现lazy=proxy
条件二:使用opensessioninview
结果:俩端都正常加载,但是通过一端在加载多端为null
条件一:多的一端实现lazy=false
条件二:不使用opensessioninview
结果:俩端都加载正常,不过通过一端再加载多端出现lazy异常
条件一:多的一端实现lazy=false
条件二:使用opensessioninview
结果:俩端都正常加载。
总结:loadall方法真的很麻烦,目前还没有弄清楚,所以尽量少用。
分享到:
相关推荐
### hibernateTemplate的常用方法详解 #### 概述 `HibernateTemplate`是Spring框架中用于操作Hibernate的一个便捷工具类,它极大地简化了Hibernate在实际应用中的集成与开发工作。通过`HibernateTemplate`,开发者...
hibernateTemplate常用方法.htm
在这样的背景下,HibernateTemplate应运而生,它采用模板设计模式,通过提供一系列通用的数据库操作方法,简化了Hibernate的使用方式,使得开发者能够更加专注于业务逻辑的实现。 #### 二、模板设计模式简介 模板...
### HibernateTemplate 的方法使用 #### 一、简介与配置方式 **HibernateTemplate** 是 Spring 框架中用于简化 Hibernate 使用的一个工具类。它通过 AOP(面向切面编程)的思想,封装了大量的 CRUD(创建、读取、...
HibernateTemplate 是 Spring 框架中的一個关键组件,用于简化 Hibernate 的使用,提供了許多实用的方法来进行数据库操作。在本文中,我们将对 HibernateTemplate 的主要方法进行总结和解释。 ...
`HibernateTemplate`提供了多种方法来执行基本的数据库操作: - **增加**:`save(Object entity)` 方法用于保存一个新的持久化实例。 - **删除**: - `void delete(Object entity)`:用于删除指定的持久化实例。 ...
在Spring框架中,`HibernateTemplate`作为ORM(Object Relational Mapping)技术中的一个重要组件,它提供了简化Hibernate操作的方法集,使得开发人员能够更加便捷地进行数据库操作。通过使用`HibernateTemplate`,...
在HibernateTemplate中,提供了多种常用的方法来实现数据访问操作(CRUD): 1. **`void delete(Object entity)`**:用于删除一个指定的对象实例。例如,如果要删除一个`Person`对象,可以直接调用此方法。 2. **`...
`HibernateTemplate`通过其核心方法`execute`支持Hibernate访问代码的实现,该方法接受一个实现了`HibernateCallback`接口的匿名内部类或Lambda表达式。 #### 二、类结构与继承关系 `HibernateTemplate`类本身并...
对于批量删除数据,`HibernateTemplate`提供了`bulkUpdate()`方法,该方法通过执行SQL语句或HQL(Hibernate查询语言)来高效地处理大量数据的删除操作,避免了逐条删除所带来的性能瓶颈。 ### 批量删除操作详解 在...
### 关于使用HibernateTemplate #### 一、简介与背景 在Java企业级应用开发中,持久层技术扮演着至关重要的角色。其中,Hibernate作为一款优秀的ORM(Object Relational Mapping)框架,极大地简化了数据访问层的...
在这个例子中,`PersonDAOImpl`通过setter方法接收SessionFactory,并初始化HibernateTemplate。`getPersons()`方法使用`find`方法获取所有Person对象,而`getPerson`方法则根据主键获取特定的Person实例。 除了...
HibernateTemplate的简单示例
`HibernateTemplate`中最常用的方法之一是`execute`方法,该方法接收一个`HibernateCallback`接口的实现作为参数。`HibernateCallback`是一个功能性接口,包含一个方法`doInHibernate`,开发者可以在该方法中编写...
- `hibernateTemplate.execute()`方法用于执行自定义的Hibernate操作。这里传入了一个实现了`HibernateCallback`接口的匿名内部类,该类的`doInHibernate`方法定义了具体的数据库操作逻辑。 ##### 2. 处理查询结果 ...
3. **使用HibernateTemplate**:在我们的业务逻辑类中,我们可以通过@Autowired注解或者使用getBean方法从Spring容器中获取HibernateTemplate实例,然后调用它的方法进行数据库操作。例如: ```java @Service ...
此外,HibernateTemplate还提供了`load()`、`execute()`等方法,以适应不同的业务需求。在实际开发中,为了事务的一致性,通常会将这些操作包裹在`@Transactional`注解的方法中,确保数据库操作的原子性和一致性。 ...
- 编写业务逻辑:调用HibernateTemplate提供的方法,如`save()`, `update()`, `delete()`, `get()`, `load()`, `execute()`等,进行数据库操作。 6. **优点与局限性**: HibernateTemplate简化了代码,提供了事务...
`HibernateTemplate`的一些常见方法包括: - 删除:`delete(Object entity)`, `deleteAll(Collection entities)` - 查询:`find(String queryString)`, `findByNamedQuery(String queryName)` - 获取:`get(Class ...