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>
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);
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);
相关文章推荐
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- Spring整合Hibernate,不用HibernateDaoSupport与HibernateTemplate而用Hibernate自己的api分析说明
- ssh HibernateDaoSupport spring 事务配置说明
- Spring整合Hibernate,不用HibernateDaoSupport与HibernateTemplate而用Hibernate自己的api分析说明
- SessionFactory、HibernateTemplate、HibernateDaoSupport之间的关系说明
- hibernateTemplate和hibernateDaoSupport的注意问题!
- HibernateDaoSupport的应用
- 自己动手写代码,整合Spring和Hibernate(三)之DAOSupport和DAOTemplate
- hibernateTemplate 与session的区别 HibernateTemplate、HibernateDaoSupport两种方法实现增删改查
- HibernateDaoSupport 简介
- spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
- spring-framework-3.2.4与hibernate-release-4.3.5下使用HibernateDaoSupport抛出异常
- 对HibernateDaoSupport进行二次封装:hibernate增删改查组件
- 关于HibernateDaoSupport中的getHibernateTemplate().execute及executeFind方法
- spring中的HibernateDaoSupport的用法
- Spring 的 HibernateDaoSupport 类的 getSession() 导致的连接泄露问题