HibernateDaoSupport的说明

HibernateDaoSupport提供了基于AOP事务的自动处理,程序员完全可以不用理会事务的开始与提交。在JDBC中一个 Connection对象使用一个事务,那么在Hibernate中一个事务肯定要关联一个SessionFactory了,然而这个 SessionFactory却没有在DAO中体现。其实主要的原因是HibernateDaoSupport类已经默默地做了封装的工作,它用一个 setSessionFactory方法将SessionFactory进行注入,所以继承自HibernateDaoSupport类的DAO都会具有 SessionFactory的属性,从而可以通过SessionFactory创建Session实例操作数据库.如图
HibernateDaoSupport的方法

虽然有set方法,但在哪注入的呢?当然是在applicationContext.xml文件上。打开这个配置文件后,可以看到如下代码:

Java代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2.   
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.   
  5.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.   
  7.   xsi:schemaLocation="http://www.springframework.org/schema/beans   
  8.   
  9. http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">   
  10.   
  11.   <bean id="sessionFactory"  
  12.   
  13.              class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  14.   
  15.              <property name="configLocation"  
  16.   
  17.                         value="classpath:hibernate.cfg.xml">   
  18.   
  19.              </property>   
  20.   
  21.   </bean>   
  22.   
  23.   <bean id="Table1DAO" class="orm.Table1DAO">   
  24.   
  25.     //将ref bean="sessionFactory"注入到Table1DAOr的property   
  26.   
  27.     //name="sessionFactory"属性中   
  28.   
  29.              <property name="sessionFactory">   
  30.   
  31.                         <ref bean="sessionFactory" />   
  32.   
  33.              </property>   
  34.   
  35.   </bean>   
  36.   
  37. </beans>  
<?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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值