HibernateDaoSupport提供了基于AOP事务的自动处理,程序员完全可以不用理会事务的开始与提交。在JDBC中一个 Connection对象使用一个事务,那么在Hibernate中一个事务肯定要关联一个SessionFactory了,然而这个 SessionFactory却没有在DAO中体现。其实主要的原因是HibernateDaoSupport类已经默默地做了封装的工作,它用一个 setSessionFactory方法将SessionFactory进行注入,所以继承自HibernateDaoSupport类的DAO都会具有 SessionFactory的属性,从而可以通过SessionFactory创建Session实例操作数据库.如图
HibernateDaoSupport的方法
虽然有set方法,但在哪注入的呢?当然是在applicationContext.xml文件上。打开这个配置文件后,可以看到如下代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>
<bean id="Table1DAO" class="orm.Table1DAO">
//将ref bean="sessionFactory"注入到Table1DAOr的property
//name="sessionFactory"属性中
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</beans>
MyEclipse工具自动将创建的DAO注入了sessionFactory的对象,所以DAO对象就具有了通过Hibernate操作数据库的功能。
HibernateDaoSupport的方法
方法 解释 例题 区别
save() 增加记录
public void setInfo(Info info) throws Exception {
getHibernateTemplate().save(info);
}
update() 修改记录 public void modifyInfo(Info info) throws Exception {
getHibernateTemplate().update(info);
}
saveOrUpdate() 将传入的对象持久化并保存。如果对象未保存(Transient状态),调用save方法保存.如果对象已保存(Detached状态),调用update方法将对象与 Session重新关联 public void attachDirty(Staff instance) {
getHibernateTemplate().saveOrUpdate(instance);
}
load() /get() 根据id获取记录 public Info getInfoById(String id) throws Exception {
Info info = (Info) getHibernateTemplate().load(Info.class, id);
return info;
}
(1)当记录不存在的时候,get()返回null,load()则会报异常
(2)load()可以返回实体类的代理类,get()返回的则是真正的实体类
(3)load方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据,而get方法仅仅在内部缓存中进行数据查找,如果没有发现数据則将越过二级缓存,直接调用SQL查询数据库。
(4)也许别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,而get则会返回最新数据
public Info findById(java.lang.Integer id) {
Info info = (Table1) getHibernateTemplate().get(Info.class,id);
return info;
}
delete() 删除记录 public void removeInfo(Info info) throws Exception {
getHibernateTemplate().delete(info);
}
find() 根据sql语句获取所有记录集合 public Iterator getAllInfos() throws Exception {
Iterator iterator = null;
String queryString = select info from Info as info order by info.id desc;
List list = getHibernateTemplate().find(queryString);
iterator = list.iterator();
return iterator;
}
findByExample() 根据一个对象返回一个集合 public List findByExample(Table1 instance) {
List results = getHibernateTemplate().findByExample(instance);
return results;
}
merge() 将传入的detached状态的对象的属性复制到持久化对象中,并返回该持久化对象.如果该session中没有关联的持久化对象,加载一个.如果传入对象未保存,保存一个副本并作为持久对象返回,传入对象依然保持detached状态 public Staff merge(Staff detachedInstance) {
Staff result = (Staff) getHibernateTemplate().merge(detachedInstance);
return result;
}
lock()
(1)lock(LockMode.NONE)不加锁(默认),表示读取数据时首先从缓存中读取,如果缓存中没有直接读取的数据,即对数据库进行操作
(2)lock(LockMode.REAd):共享读锁,Hibernate不管缓存中是否存在要读取的数据,总是跳过缓冲直接读取数据库中的数据。当底层数据库设置事务级别为Repeatable Read或者Serializable时,Hibernate读取数据,自动使用用这种锁定模式
(3)lock(LockMode.WRITE):在数据库中插入数据或者更新数据时锁定,Hibernate会在写入数据时自动使用这种模式
(4)LockMode.UPGRAdE:使用悲观锁,在Hibernate底层利用SQL中的for update子句锁定,加锁后其他事务(无论是读取,还是写入)均无法并发访问。悲观锁能防
止丢失更新和不可重复读问题,但是降低了并发性
(5) lock(LockMode.UPGRADE_NOWAIT):类似LockMode.UPDGRADE,不同的是使用for update wait子句锁定,该子句是Oracle数据库所特有的
(6)lock(LockMode.FORCE):使用版本号方式实现乐观锁时可强迫指定的持久化对象递增版本号
public void attachClean(Staff instance) {
getHibernateTemplate().lock(instance, LockMode.NONE);
分享到:
相关推荐
对于`自定义HibernateDaoSupport`这个文件,可能包含了开发者根据自身需求对`HibernateDaoSupport`的扩展,例如增加特定的查询方法或优化某些操作。这展示了开发者如何在标准库基础上进行定制化开发,以满足项目的...
本文将详细介绍`hibernateDaoSupport`的使用方法,并通过一个具体的示例来说明其在项目中的应用。 #### 二、`hibernateDaoSupport`类的核心功能 `hibernateDaoSupport`类提供了以下几个核心功能: 1. **...
1. 提供SessionFactory注入:`HibernateDaoSupport`有一个`setSessionFactory(SessionFactory sessionFactory)`方法,用于注入SessionFactory对象。SessionFactory是Hibernate的核心组件,负责创建Session实例。 2....
根据给定的信息,我们可以深入探讨Spring框架中与Hibernate集成的相关知识点,特别关注“HibernateDaoSupport”类及其在Spring环境中的应用。以下是对标题、描述以及部分文件内容的详细解析: ### 一、Spring与...
`HibernateDaoSupport`是Spring框架中为Hibernate提供的一个辅助类,用于简化DAO(数据访问对象)层的开发。本文将深入探讨`HibernateDaoSupport`的二次封装,以及如何通过封装来实现快速的统计、查询、修改和删除...
`HibernateDaoSupport`类本身提供了很多便利的方法,如执行Hibernate操作等。接下来我们将在这个类中实现分页查询的方法。 ```java public class MyHibernateDaoSupport extends HibernateDaoSupport { public ...
如果需要切换数据源,可以通过设置`HibernateDaoSupport.setSessionFactory()`方法来实现。 为了在业务逻辑中切换数据源,我们可以使用Spring的AOP(面向切面编程)和`@Transactional`注解。为每个数据源创建一个...
其次,HibernateDaoSupport通过`setSessionFactory`方法将SessionFactory注入到DAO实现类中。SessionFactory是Hibernate的核心对象,它负责创建Session实例,而Session是与数据库交互的主要接口。在Spring的配置文件...
在实际使用中,继承自 HibernateDaoSupport 的 DAO 类可以通过重写其提供的方法,利用 HibernateTemplate 提供的便利功能,实现对业务对象的 CRUD 操作。例如,下面是一些使用 HibernateDaoSupport 的示例方法: ``...
本文将详细探讨为什么在编写DAO时应尽量避免直接使用Hibernate或Spring对Hibernate的支持,并提供一种更为灵活且易于维护的方法。 #### 二、传统方法的问题 在传统的开发模式中,开发者通常会直接使用Hibernate或...
该类为子类提供了一个名为`hibernateTemplate`的属性,可以通过它调用一系列预定义的方法来进行数据库操作(如查询、更新等)。 - **示例代码**: ```java public class TestA extends HibernateDaoSupport { ...
创建DAO接口和实现类,继承HibernateDaoSupport,然后通过getHibernateTemplate()方法获取HibernateTemplate: ```java public interface UserDAO { void saveUser(User user); // 其他CRUD方法 } @...
继承自`DaoSupport`的DAO类可以利用其提供的便利方法,如`getJdbcTemplate()`或`getHibernateTemplate()`,来简化数据库操作。不过,现在更推荐使用Spring Data JPA,它提供了更高级别的抽象,减少了手动编写DAO层...
通过这种方式,开发者可以在继承`HibernateDaoSupport`的DAO实现类中直接调用`HibernateTemplate`的方法,而无需显式创建`SessionFactory`和`HibernateTemplate`。 #### 四、比较分析 - **使用场景**:`...
BaseDAO通常是通过继承HibernateDaoSupport类实现的。 BaseDAO的主要功能包括: 1. 加载指定ID的持久化对象:通过loadById方法,根据指定的类和ID加载对应的持久化对象。 2. 加载满足条件的持久化对象:通过load...
6. **DAO层支持**: 在描述中提到,我们可以选择让DAO层类继承`HibernateDaoSupport`。这个类是Spring ORM模块提供的,它提供了一个便捷的`getHibernateTemplate()`方法,可以直接使用HibernateTemplate进行数据操作...
在实现分页查询的过程中,`HibernateDaoSupport`起到了关键作用。它是Spring提供的一个支持类,使得我们可以在不直接接触`SessionFactory`的情况下,便捷地使用Hibernate的相关功能。`getHibernateTemplate()....
* 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate是 Hibernate Session的轻量级封装 * 默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的 ...
本文将深入探讨Spring对JDBCTemplate和HibernateTemplate的整合使用方法,以及JdbcDaoSupport和HibernateDaoSupport的支持。 **JdbcTemplate** JdbcTemplate是Spring提供的一个简单、灵活且强大的JDBC抽象层。它...
在这个接口中,我们可以定义一个方法来接收偏移量和每页大小,然后调用之前在`MyHibernateDaoSupport`中定义的分页查询方法。 在服务层,我们可以注入这个`StudentDao`,并通过调用`findAllByPage()`来实现对学生的...