`
daweiangel
  • 浏览: 325750 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类

菜鸟自学hibernateTemplate方法--------load方法

阅读更多
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的常用方法详解 #### 概述 `HibernateTemplate`是Spring框架中用于操作Hibernate的一个便捷工具类,它极大地简化了Hibernate在实际应用中的集成与开发工作。通过`HibernateTemplate`,开发者...

    hibernateTemplate常用方法.htm

    hibernateTemplate常用方法.htm

    HibernateTemplate原理代码-模版设计模式

    在这样的背景下,HibernateTemplate应运而生,它采用模板设计模式,通过提供一系列通用的数据库操作方法,简化了Hibernate的使用方式,使得开发者能够更加专注于业务逻辑的实现。 #### 二、模板设计模式简介 模板...

    HibernateTemplate的方法使用

    ### HibernateTemplate 的方法使用 #### 一、简介与配置方式 **HibernateTemplate** 是 Spring 框架中用于简化 Hibernate 使用的一个工具类。它通过 AOP(面向切面编程)的思想,封装了大量的 CRUD(创建、读取、...

    HibernateTemplate汇总

    HibernateTemplate 是 Spring 框架中的一個关键组件,用于简化 Hibernate 的使用,提供了許多实用的方法来进行数据库操作。在本文中,我们将对 HibernateTemplate 的主要方法进行总结和解释。 ...

    hibernateTemplate

    `HibernateTemplate`提供了多种方法来执行基本的数据库操作: - **增加**:`save(Object entity)` 方法用于保存一个新的持久化实例。 - **删除**: - `void delete(Object entity)`:用于删除指定的持久化实例。 ...

    HibernateTemplate的用法总结

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

    HibernateTemplate源代码

    `HibernateTemplate`通过其核心方法`execute`支持Hibernate访问代码的实现,该方法接受一个实现了`HibernateCallback`接口的匿名内部类或Lambda表达式。 #### 二、类结构与继承关系 `HibernateTemplate`类本身并...

    HibernateTemplate详细描述以及使用范围

    在Spring框架中,`HibernateTemplate`作为ORM(Object Relational Mapping)技术中的一个重要组件,它提供了简化Hibernate操作的方法集,使得开发人员能够更加便捷地进行数据库操作。通过使用`HibernateTemplate`,...

    hibernateTemplate批量删除数据

    对于批量删除数据,`HibernateTemplate`提供了`bulkUpdate()`方法,该方法通过执行SQL语句或HQL(Hibernate查询语言)来高效地处理大量数据的删除操作,避免了逐条删除所带来的性能瓶颈。 ### 批量删除操作详解 在...

    关于使用HibernateTemplate

    ### 关于使用HibernateTemplate #### 一、简介与背景 在Java企业级应用开发中,持久层技术扮演着至关重要的角色。其中,Hibernate作为一款优秀的ORM(Object Relational Mapping)框架,极大地简化了数据访问层的...

    HibernateTemplate 的常规用法.doc

    在这个例子中,`PersonDAOImpl`通过setter方法接收SessionFactory,并初始化HibernateTemplate。`getPersons()`方法使用`find`方法获取所有Person对象,而`getPerson`方法则根据主键获取特定的Person实例。 除了...

    HibernateTemplate的简单示例

    HibernateTemplate的简单示例

    HibernateTemplate类的使用

    `HibernateTemplate`中最常用的方法之一是`execute`方法,该方法接收一个`HibernateCallback`接口的实现作为参数。`HibernateCallback`是一个功能性接口,包含一个方法`doInHibernate`,开发者可以在该方法中编写...

    HibernateTemplate分组统计

    - `hibernateTemplate.execute()`方法用于执行自定义的Hibernate操作。这里传入了一个实现了`HibernateCallback`接口的匿名内部类,该类的`doInHibernate`方法定义了具体的数据库操作逻辑。 ##### 2. 处理查询结果 ...

    一个模拟Spring将SessionFactory注入到HibernateTemplate的小例子

    3. **使用HibernateTemplate**:在我们的业务逻辑类中,我们可以通过@Autowired注解或者使用getBean方法从Spring容器中获取HibernateTemplate实例,然后调用它的方法进行数据库操作。例如: ```java @Service ...

    SSH2增删改查使用HibernateTemplate

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

    Spring_Spring_Hibernate_HibernateTemplate

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

    HibernateTemplate及generator用法.doc

    `HibernateTemplate`的一些常见方法包括: - 删除:`delete(Object entity)`, `deleteAll(Collection entities)` - 查询:`find(String queryString)`, `findByNamedQuery(String queryName)` - 获取:`get(Class ...

Global site tag (gtag.js) - Google Analytics