您的位置:首页 > 其它

HibernateDaoSupport的说明

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

HibernateDaoSupport的方法

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

Java代码







<?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>
<?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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐