`
xuyuanshuaaa
  • 浏览: 393849 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

HibernateDaoSupport的方法

 
阅读更多
  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 与@Autowired

    对于`自定义HibernateDaoSupport`这个文件,可能包含了开发者根据自身需求对`HibernateDaoSupport`的扩展,例如增加特定的查询方法或优化某些操作。这展示了开发者如何在标准库基础上进行定制化开发,以满足项目的...

    hibernateDaoSupport类的运用实例

    本文将详细介绍`hibernateDaoSupport`的使用方法,并通过一个具体的示例来说明其在项目中的应用。 #### 二、`hibernateDaoSupport`类的核心功能 `hibernateDaoSupport`类提供了以下几个核心功能: 1. **...

    HibernateDaoSupport的使用

    1. 提供SessionFactory注入:`HibernateDaoSupport`有一个`setSessionFactory(SessionFactory sessionFactory)`方法,用于注入SessionFactory对象。SessionFactory是Hibernate的核心组件,负责创建Session实例。 2....

    spring 理解文件HibernateDaoSupport

    根据给定的信息,我们可以深入探讨Spring框架中与Hibernate集成的相关知识点,特别关注“HibernateDaoSupport”类及其在Spring环境中的应用。以下是对标题、描述以及部分文件内容的详细解析: ### 一、Spring与...

    HibernateDaoSupport二次封装组件,快速统计和查询,修改

    `HibernateDaoSupport`是Spring框架中为Hibernate提供的一个辅助类,用于简化DAO(数据访问对象)层的开发。本文将深入探讨`HibernateDaoSupport`的二次封装,以及如何通过封装来实现快速的统计、查询、修改和删除...

    HibernateDaoSupport分页.

    `HibernateDaoSupport`类本身提供了很多便利的方法,如执行Hibernate操作等。接下来我们将在这个类中实现分页查询的方法。 ```java public class MyHibernateDaoSupport extends HibernateDaoSupport { public ...

    springboot2.0多数据源集成hibernate配置hibernateDaoSupport示例

    如果需要切换数据源,可以通过设置`HibernateDaoSupport.setSessionFactory()`方法来实现。 为了在业务逻辑中切换数据源,我们可以使用Spring的AOP(面向切面编程)和`@Transactional`注解。为每个数据源创建一个...

    HibernateDaoSupport.docx

    其次,HibernateDaoSupport通过`setSessionFactory`方法将SessionFactory注入到DAO实现类中。SessionFactory是Hibernate的核心对象,它负责创建Session实例,而Session是与数据库交互的主要接口。在Spring的配置文件...

    hibernateTemplate和HibernateDaoSupport

    在实际使用中,继承自 HibernateDaoSupport 的 DAO 类可以通过重写其提供的方法,利用 HibernateTemplate 提供的便利功能,实现对业务对象的 CRUD 操作。例如,下面是一些使用 HibernateDaoSupport 的示例方法: ``...

    hibernateDaoSupport.txt

    本文将详细探讨为什么在编写DAO时应尽量避免直接使用Hibernate或Spring对Hibernate的支持,并提供一种更为灵活且易于维护的方法。 #### 二、传统方法的问题 在传统的开发模式中,开发者通常会直接使用Hibernate或...

    HibernateDaoSupport与JdbcDaoSupport

    该类为子类提供了一个名为`hibernateTemplate`的属性,可以通过它调用一系列预定义的方法来进行数据库操作(如查询、更新等)。 - **示例代码**: ```java public class TestA extends HibernateDaoSupport { ...

    Spring+Hibernate实现增删改查的两种方法

    创建DAO接口和实现类,继承HibernateDaoSupport,然后通过getHibernateTemplate()方法获取HibernateTemplate: ```java public interface UserDAO { void saveUser(User user); // 其他CRUD方法 } @...

    JPA(hibernate) Dao 和 DaoSupport

    继承自`DaoSupport`的DAO类可以利用其提供的便利方法,如`getJdbcTemplate()`或`getHibernateTemplate()`,来简化数据库操作。不过,现在更推荐使用Spring Data JPA,它提供了更高级别的抽象,减少了手动编写DAO层...

    hibernateDaoSurpport和hibernateTemplate

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

    常用的BaseDAO及其实现

    BaseDAO通常是通过继承HibernateDaoSupport类实现的。 BaseDAO的主要功能包括: 1. 加载指定ID的持久化对象:通过loadById方法,根据指定的类和ID加载对应的持久化对象。 2. 加载满足条件的持久化对象:通过load...

    spring-boot 集成hibernate

    6. **DAO层支持**: 在描述中提到,我们可以选择让DAO层类继承`HibernateDaoSupport`。这个类是Spring ORM模块提供的,它提供了一个便捷的`getHibernateTemplate()`方法,可以直接使用HibernateTemplate进行数据操作...

    Struts2,hibernate,Spring分页方法

    在实现分页查询的过程中,`HibernateDaoSupport`起到了关键作用。它是Spring提供的一个支持类,使得我们可以在不直接接触`SessionFactory`的情况下,便捷地使用Hibernate的相关功能。`getHibernateTemplate()....

    Spring_Hibernate集成

    * 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate是 Hibernate Session的轻量级封装 * 默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的 ...

    Spring持久化模板总结

    本文将深入探讨Spring对JDBCTemplate和HibernateTemplate的整合使用方法,以及JdbcDaoSupport和HibernateDaoSupport的支持。 **JdbcTemplate** JdbcTemplate是Spring提供的一个简单、灵活且强大的JDBC抽象层。它...

    hibernate分页技术.doc

    在这个接口中,我们可以定义一个方法来接收偏移量和每页大小,然后调用之前在`MyHibernateDaoSupport`中定义的分页查询方法。 在服务层,我们可以注入这个`StudentDao`,并通过调用`findAllByPage()`来实现对学生的...

Global site tag (gtag.js) - Google Analytics