首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

来源于:http://hi.baidu.com/%BB%A8%BB%F0%C8%D5%BC%C7/blog/item/9f4e9325b7384c6e34a80

2012-11-08 
来自:http://hi.baidu.com/%BB%A8%BB%F0%C8%D5%BC%C7/blog/item/9f4e9325b7384c6e34a80f来自:http://hi.ba

来自:http://hi.baidu.com/%BB%A8%BB%F0%C8%D5%BC%C7/blog/item/9f4e9325b7384c6e34a80f
来自:http://hi.baidu.com/%BB%A8%BB%F0%C8%D5%BC%C7/blog/item/9f4e9325b7384c6e34a80fa3.html



二、spring整合hibernate
   1. 查看applicationContext.xml有了变化,多了hibernate的配置
   2. 建立表的映射
      选择数据库视图,accp数据库
      生成users.hbm.xml与Users.java
      去掉catagory属性,否则会报错
      也在applicationContext.xml中增加了映射
   3. 整合hibernate有两种方式
   4. 第一种方式,继承
      org.springframework.orm.hibernate3.HibernateTemplate,该类是spring封装了操作Hibernate的实现细节的类,用于代替Session的相关操作。主要方法:
Serializable save(Object?entity) :保存记录
void update(Object?entity) :修改记录
void delete(Object?entity) :删除记录
Object get(Class?entityClass, Serializable?id)
Object load(Class?entityClass, Serializable?id)
List executeFind(HibernateCallback?action) :查询,返回集合
Object execute(HibernateCallback?action):查询,返回对象
总的说来,该类的方法和Session接口中定义的方法是一致的.
     1)在dao包中写接口IDao,
       public interface IDao {
public void save(Users u);
public List getAll();
public boolean validate(Users u);
       }

       UserDao extends HibernateDaoSupport implements IDao
public class UserDao extends HibernateDaoSupport implements IDao{
   public void save(Users u){
     this.getHibernateTemplate().save(u);
   }
}
     2)在spring中配置UserDao,从哪取连接,property二择其一
        给继承了HibernateDaoSupport的对象我们注入一个sessionFactory 对象也可以,他会自动生成一个hibernateTemplate对象
<bean id="userdao" ref="sessionFactory" />
   <!--<property name="hibernateTemplate" ref="hibernateTemplate"/>-->
</bean>
     3)测试
        导入mysql.jar,不能拷贝到lib下,也找不到,这时要在buildPath中导入外部jar
去掉users.hbm.xml中的catagory属性,否则会报错
  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
   IDao dele = (IDao)ac.getBean("userdao");
   Users u = new Users();
   u.setUid("userdao");
   u.setPwd("123");
   u.setVersion(2);
   dele.save(u);
    
   5. 第二种方式
     1) 新建一个类UserDao2,加一成员变量HibernateTemplate
         加一构造函数,注入sessionFactory
加一setter方法,注入sessionFactory
     public class UserDao2 implements IDao{
private HibernateTemplate hibernateTemplate;
public UserDao2(HibernateTemplate hibernateTemplate) {
   this.hibernateTemplate = hibernateTemplate;
}
public void save(Users u){
   hibernateTemplate.save(u);
}
      }
    
     2) 改配置文件applicationContext.xml
<bean id="userdao2" ref="sessionFactory"/>
    </bean>
    <bean id="urlMapping" ref="openSessionInViewInterceptor"/>
   <property name="mappings">
      <props>
      ......
      </props>
   </property>
    </bean>
2) Filter,在web.xml中配置
<filter>
   <filter-name>hibernateFilter</filter-name>
   <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
   <!-- 默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里 -->
   <init-param>
     <param-name>sessionFactoryBeanName</param-name>
     <param-value>sessionFactory</param-value>
   </init-param>
   <!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
   <init-param>
     <param-name>singleSession</param-name>
     <param-value>true</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>hibernateFilter</filter-name>
   <url-pattern>*.do</url-pattern>
</filter-mapping>

加了这个配置,就要加监听器和初始文件的参数,否则报错
<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

   7. HibernateDaoSupport与自动提交
     每执行一个sql,默认都是由spring自动提交事务。可以在数据源中插入进去
<property name="defaultAutoCommit">
   <value>false</value>
</property>
    
   8. spring整合hibernate事务
Don't call me, I will call you
更少代码,更少BUG
    Spring提供的事务管理可以分为两类:编程式的和声明式的。
    1) 编程式的
比较灵活,但是代码量大,存在重复的代码比较多,当你只有很少的事务操作时,编程式事务管理通常比较合适。
    代码
public class UserDao3 extends HibernateDaoSupport implements IDao{
private HibernateTransactionManager transactionManager;
public void setTransactionManager(HibernateTransactionManager transactionManager) {
   this.transactionManager = transactionManager;
}
public void save(Users u){
   DefaultTransactionDefinition def = new DefaultTransactionDefinition();
   TransactionStatus status = transactionManager.getTransaction(def);
   try{
    this.getHibernateTemplate().save(u);
    //不提交插入不了
    transactionManager.commit(status);
   }catch(Exception e) {
    transactionManager.rollback(status);
   }
   }
}
     配置
     <bean id="userdao3" ref="sessionFactory"/>
   <property name="transactionManager" ref="transactionManager"/>
</bean>
<bean id="transactionManager"
        ref="sessionFactory"></property>  
   </bean>

    <bean id="proxyTemplate" + cls.getName() + " as a order by a.uid desc").list();
    }
   });
}

// execute返回对象
public boolean validate(final Users u) {
   List ls = (List) this.getHibernateTemplate().execute(
     new HibernateCallback() {
      public Object doInHibernate(Session session)
        throws HibernateException, SQLException {
       Query qy = session
         .createQuery("from Users u where u.uid=:uid and u.pwd=:pwd");
       qy.setString("uid", u.getUid());
       qy.setString("pwd", u.getPwd());
       List li = qy.list();
       return li;
      }
     });
   return (ls.size() > 0);
}

热点排行