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

菜鸟自学HibernateTemplate方法---------get方法学习

阅读更多
关于HibernateTemplate方法的一些总结
前言:
写这篇文章的目的主要是熟悉HibernateTemplate的方法的使用,刚刚学习ssh,在持久层中使用hibernate,spring对基础的hibernate方法进行了包装,虽然可以绕过spring使用纯正的hibernate方法实现CRUD,可是hibernateTemplate的方法同样也需要认真学习。

Summary
//方法一
public Object get(Class entityClass, Serializable id) throws DataAccessException {
		return get(entityClass, id, null);
	}
public Object get(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.get(entityClass, id, lockMode);
				}
				else {
					return session.get(entityClass, id);
				}
			}
		});
	}




Method Analysis
方法一:hibernateTemplate的get方法用于查询返回指定的对象,需要指定所要查询的实体类(entityClass),实体对象在数据库中对应的主键编号(id),重载方法支持一个参数org.hibernate.LockMode
由于不大了解LockMode这个类所以下面插入一下对这个类的分析
 首先我先看了下它的源代码
一段描述类的注释


/**
* Instances represent a lock mode for a row of a relational
* database table. It is not intended that users spend much
* time worrying about locking since Hibernate usually
* obtains exactly the right lock level automatically.
* Some "advanced" users may wish to explicitly specify lock
* levels.
*
* @see Session#lock(Object,LockMode)
* @author Gavin King
*/
实例代表关系型数据库表中一条记录的锁定方式,Hibernate的加锁模式---包括
1. LockMode.NONE:无锁机制
      2. LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取
      3. LockMode.READ:Hibernate在读取记录的时候会自动获取
      4. LockMode.UPGRADE:利用数据库的for update子句加锁
      5. LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的for update nowait子句实现加锁

下面是我做的一点测试,关闭opensessioninview过滤器,没有添加transactionManager.
Person person1 = personService.get(3);
person1.setName("person");
personService.save(person1);

//查询编号为3的记录,插入成功数据库中增加了一条数据。
//当我配置了opensessioninview过滤器后,这个操作报出异常如下:
javax.servlet.ServletException: org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
Root caus:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

解决方法:就是把删除,修改,添加放在transaction中。可以用spring的aop方便解决
OpenSessionInViewFilter调用流程: request(请求)->open session并开始
transaction->controller->View(Jsp)->结束transaction并close session.
一切看起来很正确,尤其是在本地开发测试的时候没出现问题,但试想下如果流程中的某一步被阻塞的话,那在这期间connection就一直被占
用而不释放。最有可能被阻塞的就是在写Jsp这步,一方面可能是页面内容大,response.write的时间长,另一方面可能是网速慢,服务器与用
户间传输时间久。当大量这样的情况出现时,就有连接池连接不足,造成页面假死现象。
Opensessioninview 设置flushMode为never 无论如何也不要把数据的任何变化反映到数据库中去,所以对数据的insert,delete,update操作都无法执行,所以会出现异常。所以应该使用aop将load,get等方法设置为read-only。
比如下面的配置:
<bean id="baseTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"           
abstract="true">         
<property name="transactionManager" ref="transactionManager"/>         
<property name="proxyTargetClass" value="true"/>        
 <property name="transactionAttributes">             
<props>                 
<prop key="get*">
PROPAGATION_REQUIRED,readOnly
</prop>                 
<prop key="find*">
PROPAGATION_REQUIRED,readOnly
</prop>        
<prop key="load*">PROPAGATION_REQUIRED,readOnly
</prop>                 
<prop key="save*">PROPAGATION_REQUIRED</prop> 
<prop key="add*">PROPAGATION_REQUIRED</prop>                
<prop key="update*">PROPAGATION_REQUIRED</prop>  
<prop key="remove*">PROPAGATION_REQUIRED</prop>             
</props>         
</property>     
</bean>     
<bean id="userService" parent="baseTransaction">         
<property name="target">             
<bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>         
</property>     
</bean> 


回到我们刚才断点,这里我不配置opensessioninview试验。
LockMode.UPGRADE:利用数据库的for update子句加锁,是最高级别的锁定了,目前我只能理解到,如果我需要查询某条记录并更新状态时,使用此锁定模式,当另外一个线程同样也是此操作的话,是处于锁定状态的。网上有个例子是对此的应用可以参照。
http://wiki.iteye.com/blog/195650
LockMode.WRITE:跟了下源码发现当设置此模式的话,定义为抛出异常
javax.servlet.ServletException: java.lang.IllegalArgumentException: Invalid lock mode for loading—不适当的锁定模式
好了,带有lockmode的方法我目前只能写到这里,毕竟还是菜鸟,后面将不讨论带有lockmode的方法。
方法2:
    
 public Object get(String entityName, Serializable id) throws DataAccessException {
		return get(entityName, id, null);
	}

	public Object get(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.get(entityName, id, lockMode);
				}
				else {
					return session.get(entityName, id);
				}
			}
		});
	}

HibernateTemplate的get方法还有另外俩个重载,参数分别为String 和 id
下面是个例子
 
Person person1 = personService.get("domain.person.Person",3);
   System.out.println(person1.getName()+"---------"+person1.getPassword());


String参数需要传递的是完整的实体类名。

分享到:
评论
1 楼 飞火流星 2009-04-08  
需要指定所要查询的实体类(entityClass),实体对象在数据库中对应的主键编号(id)
其中的"主键编号id"可以是assign的char类型的吗?

相关推荐

    hibernateTemplate的常用方法

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

    hibernateTemplate常用方法.htm

    hibernateTemplate常用方法.htm

    HibernateTemplate的方法使用

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

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

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

    HibernateTemplate汇总

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

    hibernateTemplate

    通过本文的介绍,我们不仅了解了`HibernateTemplate`的核心功能,还通过具体的示例代码深入学习了其在实际项目中的应用方式。希望本文能帮助读者更好地理解和掌握`HibernateTemplate`的使用技巧。

    HibernateTemplate详细描述以及使用范围

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

    HibernateTemplate的用法总结

    通过上述介绍可以看出,HibernateTemplate为开发者提供了一个高效、简洁的方式来操作Hibernate,大大降低了学习曲线和开发难度。在实际应用中,合理利用这些功能,可以有效提升开发效率和代码质量。

    HibernateTemplate源代码

    ### HibernateTemplate源代码解析 #### 一、简介 `HibernateTemplate`是Spring框架中的一个类,位于`org.spring...通过对`HibernateTemplate`的学习和使用,可以大大提高基于Hibernate的数据访问层的开发效率和质量。

    HibernateTemplate 的常规用法.doc

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

    hibernateTemplate批量删除数据

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

    关于使用HibernateTemplate

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

    HibernateTemplate的简单示例

    HibernateTemplate的简单示例

    HibernateTemplate分组统计

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

    HibernateTemplate类的使用

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

    HibernateTemplate及generator用法.doc

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

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

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

    我的智囊团(SSH)01--07学习笔记

    DAO类中的其他方法如`getPersons()`、`getPerson()`和`savePerson()`则直接调用`HibernateTemplate`的相应方法来执行数据库操作。 使用`HibernateTemplate`的好处在于它自动处理了事务管理、异常转换和资源关闭等...

    hibernateDaoSurpport和hibernateTemplate

    通过这种方式,开发者可以在继承`HibernateDaoSupport`的DAO实现类中直接调用`HibernateTemplate`的方法,而无需显式创建`SessionFactory`和`HibernateTemplate`。 #### 四、比较分析 - **使用场景**:`...

Global site tag (gtag.js) - Google Analytics