love fish大鵬一曰同風起,扶搖直上九萬里

          常用鏈接

          統計

          積分與排名

          friends

          link

          最新評論

          SSH(Spring + Struts + Hibernate)小試(轉)

          之前對Spring Struts Hibernate都稍有了解,Spring的IOC給我留下了很深的印象,容器管理的對象生成
          方法極大地簡化了程序邏輯,Spring也提供了用于Web的Spring MVC 框架,由于我感覺其易用性還是不及
          Struts,所以我還是選擇Struts作為前端WEB框架,Hibernate我一直沒有在Web應用中試過,這次當然不會
          錯過機會了。


          開發環境的塔建我就不多說了,具體可以參考我以前的幾篇日志。

          在Eclipse中新建一個動態Web工程,將Struts 、Spring、Hibernate需要的jar都添加到WEB-INF/lib目錄下,
          將Struts標簽所需的tld文件、struts-config.xml文件(可以由StrutsIDE生成)添加到WEB-INF下,另外在
          此目錄下添加一個Spring的配置文件applicationContext.xml。


          我參考的例子是夏昕的《深入淺出Hibernate》上的第6章,很好的一個論壇示例。

          首先按照書上的ER模型,在數據庫(MySQL)中建立相應的數據庫。


          create database forum;

          use forum;

          create table user(
          ?id int not null auto_increment primary key,
          ?name varchar(50),
          ?pwd varchar(50),
          ?email varchar(50)

          )type=innodb;


          create table board(
          ?id int not null auto_increment primary key,?
          ?parent_id int,
          ?create_by int not null,
          ?name varchar(50) not null,
          ?remark varchar(255),
          ?create_time datetime,

          ?index(parent_id),
          ?index(create_by),

          ?foreign key(parent_id) references board(id) on delete cascade,
          ?foreign key(create_by) references user(id) on delete no action
          ?
          )type=innodb;


          create table article(
          ?id int not null auto_increment primary key,?
          ?parent_id int ,
          ?board_id int not null,
          ?article_type int not null,
          ?title varchar(255),
          ?body text,
          ?create_by int not null,

          ?create_time datetime,
          ?hits int unsigned,
          ?bytes int unsigned,
          ?last_update_by int not null,
          ?last_update_time datetime,

          ?index(parent_id),
          ?index(board_id),
          ?index(create_by),
          ?index(last_update_by),

          ?foreign key(parent_id) references article(id) on delete no action,
          ?foreign key(board_id) references board(id) on delete cascade,
          ?foreign key(create_by) references user(id) on delete no action,
          ?foreign key(last_update_by) references user(id) on delete no action
          ?
          )type=innodb;

          之后,我選擇了用Hibernate Sychonizer來生成映射文件和實體類,然后對生成的類進行修改(刪掉了生成的Base類),
          實際上Hibernate Sychonizer生成的映射文件也有錯誤,需要修改,我也是后來在使用中發現的。

          //User.hbm.xml

          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC
          ?"-//Hibernate/Hibernate Mapping DTD//EN"
          ?"
          http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd " >

          <hibernate-mapping package="com.lzy.forum.domain">
          ?<class
          ??name="User"
          ??table="user"
          ?>

          ??<id
          ???name="Id"
          ???type="integer"
          ???column="id"
          ??>
          ???<generator class="native"/>
          ??</id>

          ??<property
          ???name="Name"
          ???column="name"
          ???type="string"
          ???not-null="false"
          ???length="50"
          ??/>
          ??<property
          ???name="Pwd"
          ???column="pwd"
          ???type="string"
          ???not-null="false"
          ???length="50"
          ??/>
          ??<property
          ???name="Email"
          ???column="email"
          ???type="string"
          ???not-null="false"
          ???length="50"
          ??/>
          ?

          ??<set name="ArticlesByLastUpdateBy" inverse="true" lazy="true">
          ???<key column="last_update_by"/>
          ???<one-to-many class="Article"/>
          ??</set>

          ??<set name="ArticlesByCreateBy" inverse="true" lazy="true">
          ???<key column="create_by"/>這里的create_by是后來修改的,Hibernate Sychonizer生成的有錯,后面有幾處同樣的錯誤】
          ???<one-to-many class="Article"/>
          ??</set>

          ??<set name="Boards" inverse="true" lazy="true">
          ???<key column="create_by"/>【這里的create_by是后來修改的】

          ???<one-to-many class="Board"/>
          ??</set>


          ?</class>?
          </hibernate-mapping>

          //User.java
          package com.lzy.forum.domain;


          public class User{
          ?private static final long serialVersionUID = 1L;

          //? primary key
          ?private java.lang.Integer id;

          ?// fields
          ?private java.lang.String name;
          ?private java.lang.String pwd;
          ?private java.lang.String email;

          ?// collections
          ?private java.util.Set<Article> articlesByLastUpdateBy;
          ?private java.util.Set<Article> articlesByCreateBy;
          ?private java.util.Set<Board> boards;
          ?
          ?
          ?public java.util.Set<Article> getArticlesByCreateBy() {
          ??return articlesByCreateBy;
          ?}
          ?public void setArticlesByCreateBy(java.util.Set<Article> articlesByCreateBy) {
          ??this.articlesByCreateBy = articlesByCreateBy;
          ?}
          ?public java.util.Set<Article> getArticlesByLastUpdateBy() {
          ??return articlesByLastUpdateBy;
          ?}
          ?public void setArticlesByLastUpdateBy(
          ???java.util.Set<Article> articlesByLastUpdateBy) {
          ??this.articlesByLastUpdateBy = articlesByLastUpdateBy;
          ?}
          ?public java.util.Set<Board> getBoards() {
          ??return boards;
          ?}
          ?public void setBoards(java.util.Set<Board> boards) {
          ??this.boards = boards;
          ?}
          ?public java.lang.String getEmail() {
          ??return email;
          ?}
          ?public void setEmail(java.lang.String email) {
          ??this.email = email;
          ?}
          ?public java.lang.Integer getId() {
          ??return id;
          ?}
          ?public void setId(java.lang.Integer id) {
          ??this.id = id;
          ?}
          ?public java.lang.String getName() {
          ??return name;
          ?}
          ?public void setName(java.lang.String name) {
          ??this.name = name;
          ?}
          ?public java.lang.String getPwd() {
          ??return pwd;
          ?}
          ?public void setPwd(java.lang.String pwd) {
          ??this.pwd = pwd;
          ?}


          }

          //Board.hbm.xml

          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC
          ?"-//Hibernate/Hibernate Mapping DTD//EN"
          ?"
          http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd " >

          <hibernate-mapping package="com.lzy.forum.domain">
          ?<class
          ??name="Board"
          ??table="board"
          ?>
          ???<meta attribute="sync-DAO">false</meta>
          ??<id
          ???name="Id"
          ???type="integer"
          ???column="id"
          ??>
          ???<generator class="native"/>
          ??</id>

          ??<property
          ???name="Name"
          ???column="name"
          ???type="string"
          ???not-null="true"
          ???length="50"
          ??/>
          ??<property
          ???name="Remark"
          ???column="remark"
          ???type="string"
          ???not-null="false"
          ???length="255"
          ??/>
          ??<property
          ???name="CreateTime"
          ???column="create_time"
          ???type="timestamp"
          ???not-null="false"
          ???length="19"
          ??/>
          ??<many-to-one
          ???name="CreateBy"
          ???column="create_by"
          ???class="User"
          ???not-null="true"
          ??>
          ??</many-to-one>
          ??<many-to-one
          ???name="Parent"
          ???column="parent_id"
          ???class="Board"???
          ???not-null="false"
          ???lazy="false">
          ??</many-to-one>
          ?

          ??<set name="Articles" inverse="true" lazy="true" order-by="id">
          ???<key column="board_id"/>【這里的board_id是后來修改的】
          ???<one-to-many class="Article"/>
          ??</set>

          ??<set name="ChildBoards" inverse="true"? lazy="true" order-by="id">
          ???<key column="parent_id"/>這里的parent_id是后來修改的】
          ???<one-to-many class="Board"/>
          ??</set>


          ?</class>?
          </hibernate-mapping>

          //Board.java
          package com.lzy.forum.domain;

          ?


          public class Board? {
          ?private static final long serialVersionUID = 1L;

          //? primary key
          ?private java.lang.Integer id;

          ?// fields
          ?private java.lang.String name;
          ?private java.lang.String remark;
          ?private java.util.Date createTime;

          ?// many to one
          ?private com.lzy.forum.domain.User createBy;
          ?private com.lzy.forum.domain.Board parent;

          ?// collections
          ?private java.util.Set<com.lzy.forum.domain.Article> articles;
          ?private java.util.Set<com.lzy.forum.domain.Board> childBoards;
          ?
          ?
          ?public java.util.Set<com.lzy.forum.domain.Article> getArticles() {
          ??return articles;
          ?}
          ?public void setArticles(java.util.Set<com.lzy.forum.domain.Article> articles) {
          ??this.articles = articles;
          ?}
          ?public java.util.Set<com.lzy.forum.domain.Board> getChildBoards() {
          ??return childBoards;
          ?}
          ?public void setChildBoards(java.util.Set<com.lzy.forum.domain.Board> childBoards) {
          ??this.childBoards = childBoards;
          ?}
          ?public com.lzy.forum.domain.User getCreateBy() {
          ??return createBy;
          ?}
          ?public void setCreateBy(com.lzy.forum.domain.User createBy) {
          ??this.createBy = createBy;
          ?}
          ?public java.util.Date getCreateTime() {
          ??return createTime;
          ?}
          ?public void setCreateTime(java.util.Date createTime) {
          ??this.createTime = createTime;
          ?}
          ?public java.lang.Integer getId() {
          ??return id;
          ?}
          ?public void setId(java.lang.Integer id) {
          ??this.id = id;
          ?}
          ?public java.lang.String getName() {
          ??return name;
          ?}
          ?public void setName(java.lang.String name) {
          ??this.name = name;
          ?}
          ?public com.lzy.forum.domain.Board getParent() {
          ??return parent;
          ?}
          ?public void setParent(com.lzy.forum.domain.Board parent) {
          ??this.parent = parent;
          ?}
          ?public java.lang.String getRemark() {
          ??return remark;
          ?}
          ?public void setRemark(java.lang.String remark) {
          ??this.remark = remark;
          ?}


          }

          //Article.hbm.xml

          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC
          ?"-//Hibernate/Hibernate Mapping DTD//EN"
          ?"
          http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd " >

          <hibernate-mapping package="com.lzy.forum.domain">
          ?<class
          ??name="Article"
          ??table="article"
          ?>
          ??<meta attribute="sync-DAO">false</meta>
          ??<id
          ???name="Id"
          ???type="integer"
          ???column="id"
          ??>
          ???<generator class="native"/>
          ??</id>

          ??<property
          ???name="ArticleType"
          ???column="article_type"
          ???type="integer"
          ???not-null="true"
          ???length="11"
          ??/>
          ??<property
          ???name="Title"
          ???column="title"
          ???type="string"
          ???not-null="false"
          ???length="255"
          ??/>
          ??<property
          ???name="Body"
          ???column="body"
          ???type="string"
          ???not-null="false"
          ??/>
          ??<property
          ???name="Hits"
          ???column="hits"
          ???type="integer"
          ???not-null="false"
          ???length="10"
          ??/>
          ??<property
          ???name="Bytes"
          ???column="bytes"
          ???type="integer"
          ???not-null="false"
          ???length="10"
          ??/>
          ??<property
          ???name="CreateTime"
          ???column="create_time"
          ???type="timestamp"
          ???not-null="false"
          ???length="19"
          ??/>
          ??<property
          ???name="LastUpdateTime"
          ???column="last_update_time"
          ???type="timestamp"
          ???not-null="false"
          ???length="19"
          ??/>
          ??<many-to-one
          ???name="LastUpdateBy"
          ???column="last_update_by"
          ???class="User"
          ???not-null="true"
          ??>
          ??</many-to-one>
          ??<many-to-one
          ???name="CreateBy"
          ???column="create_by"
          ???class="User"
          ???not-null="true"
          ??>
          ??</many-to-one>
          ??<many-to-one
          ???name="Parent"
          ???column="parent_id"
          ???class="Article"
          ???not-null="false"
          ??>
          ??</many-to-one>
          ??<many-to-one
          ???name="Board"
          ???column="board_id"
          ???class="Board"
          ???not-null="true"
          ??>
          ??</many-to-one>
          ?

          ??<set name="Articles" inverse="true" lazy="false" order-by="id">
          ???<key column="parent_id"/>【這里的parent_id是后來修改的】
          ???<one-to-many class="Article"/>
          ??</set>


          ?</class>?
          </hibernate-mapping>



          //Article.java
          package com.lzy.forum.domain;

          import java.util.Date;

          ?


          public class Article? {
          ?private static final long serialVersionUID = 1L;
          ?// primary key
          ?private java.lang.Integer id;

          ?// fields
          ?private java.lang.Integer articleType;
          ?private java.lang.String title;
          ?private java.lang.String body;
          ?private java.lang.Integer hits;
          ?private java.lang.Integer bytes;
          ?private java.util.Date lastUpdateTime;
          ?private java.util.Date createTime;
          ?

          ?// many to one
          ?private com.lzy.forum.domain.User lastUpdateBy;
          ?private com.lzy.forum.domain.User createBy;
          ?private com.lzy.forum.domain.Article parent;
          ?private com.lzy.forum.domain.Board board;

          ?// collections
          ?private java.util.Set<com.lzy.forum.domain.Article> articles;

          ?public java.util.Set<com.lzy.forum.domain.Article> getArticles() {
          ??return articles;
          ?}

          ?public void setArticles(java.util.Set<com.lzy.forum.domain.Article> articles) {
          ??this.articles = articles;
          ?}

          ?public java.lang.Integer getArticleType() {
          ??return articleType;
          ?}

          ?public void setArticleType(java.lang.Integer articleType) {
          ??this.articleType = articleType;
          ?}

          ?public com.lzy.forum.domain.Board getBoard() {
          ??return board;
          ?}

          ?public void setBoard(com.lzy.forum.domain.Board board) {
          ??this.board = board;
          ?}

          ?public java.lang.String getBody() {
          ??return body;
          ?}

          ?public void setBody(java.lang.String body) {
          ??this.body = body;
          ?}

          ?public java.lang.Integer getBytes() {
          ??return bytes;
          ?}

          ?public void setBytes(java.lang.Integer bytes) {
          ??this.bytes = bytes;
          ?}

          ?public com.lzy.forum.domain.User getCreateBy() {
          ??return createBy;
          ?}

          ?public void setCreateBy(com.lzy.forum.domain.User createBy) {
          ??this.createBy = createBy;
          ?}

          ?public java.lang.Integer getHits() {
          ??return hits;
          ?}

          ?public void setHits(java.lang.Integer hits) {
          ??this.hits = hits;
          ?}

          ?public java.lang.Integer getId() {
          ??return id;
          ?}

          ?public void setId(java.lang.Integer id) {
          ??this.id = id;
          ?}

          ?public com.lzy.forum.domain.User getLastUpdateBy() {
          ??return lastUpdateBy;
          ?}

          ?public void setLastUpdateBy(com.lzy.forum.domain.User lastUpdateBy) {
          ??this.lastUpdateBy = lastUpdateBy;
          ?}

          ?public java.util.Date getLastUpdateTime() {
          ??return lastUpdateTime;
          ?}

          ?public void setLastUpdateTime(java.util.Date lastUpdateTime) {
          ??this.lastUpdateTime = lastUpdateTime;
          ?}

          ?public com.lzy.forum.domain.Article getParent() {
          ??return parent;
          ?}

          ?public void setParent(com.lzy.forum.domain.Article parent) {
          ??this.parent = parent;
          ?}

          ?public java.lang.String getTitle() {
          ??return title;
          ?}

          ?public void setTitle(java.lang.String title) {
          ??this.title = title;
          ?}
          ?public java.util.Date getCreateTime(){
          ??return createTime;
          ?}

          ?public void setCreateTime(java.util.Date createTime) {
          ??// TODO Auto-generated method stub
          ??this.createTime = createTime;
          ?}
          ?

          }

          接下來將會在web中加入Spring支持和為實體類提供DAO支持。

          Spring和Struts結合有幾種方法,我選了最常用的PlugIn方式,在struts-config.xml中加入

          <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
          ??????<set-property property="contextConfigLocation"
          ?????????? ?value="/WEB-INF/action-servlet.xml" />
          ?</plug-in>

          WEB-INF目錄下的action-servlet.xml就是Spring的配置文件,下面給出的是整個的action-servlet.xml文件:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
          <beans>

          //Data Source

          ?<bean id="dataSource"
          ??class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          ??<property name="driverClassName">
          ???<value>com.mysql.jdbc.Driver</value>
          ??</property>
          ??<property name="url">
          ???<value>jdbc:mysql://localhost:3306/forum</value>
          ??</property>
          ??<property name="username">
          ???<value>test</value>
          ??</property>
          ??<property name="password">
          ???<null />
          ??</property>
          ?</bean>

          // For Hibernate
          ?<bean id="sessionFactory"
          ??class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          ??<property name="dataSource">
          ???<ref local="dataSource" />
          ??</property>
          ??<property name="mappingResources">
          ???<list>
          ????<value>com/lzy/forum/domain/User.hbm.xml</value>
          ????<value>com/lzy/forum/domain/Article.hbm.xml</value>
          ????<value>com/lzy/forum/domain/Board.hbm.xml</value>
          ???</list>
          ??</property>
          ??<property name="hibernateProperties">
          ???<props>
          ????<prop key="hibernate.dialect">
          ?????org.hibernate.dialect.MySQLDialect
          ????</prop>
          ????<prop key="hibernate.show_sql">true</prop>
          ???</props>
          ??</property>
          ?</bean>

          ?<bean id="transactionManager"
          ??class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          ??<property name="sessionFactory">
          ???<ref local="sessionFactory" />
          ??</property>
          ?</bean>

          ?

          // For DAO
          ?<bean id="userDAO"
          ??class="com.lzy.forum.dao.impl.UserDAOHibernate">
          ??<property name="sessionFactory">
          ???<ref local="sessionFactory" />
          ??</property>
          ?</bean>

          ?

          ?<bean id="boardDAO"
          ??class="com.lzy.forum.dao.impl.BoardDAOHibernate">
          ??<property name="sessionFactory">
          ???<ref local="sessionFactory" />
          ??</property>
          ?</bean>

          ?<bean id="articleDAO"
          ??class="com.lzy.forum.dao.impl.ArticleDAOHibernate">
          ??<property name="sessionFactory">
          ???<ref local="sessionFactory" />
          ??</property>
          ?</bean>

          //For Struts Action

          ?<bean name="/regist" class="com.lzy.forum.action.RegistAction"
          ??singleton="false">
          ??<property name="userDAO">
          ???<ref local="userDAO" />
          ??</property>

          ?</bean>


          ?<bean name="/login" class="com.lzy.forum.action.LoginAction"
          ??singleton="false">
          ??<property name="userDAO">
          ???<ref local="userDAO" />
          ??</property>

          ?</bean>

          ?<bean name="/boardManage"
          ??class="com.lzy.forum.action.BoardManageAction" singleton="false">
          ??<property name="userDAO">
          ???<ref local="userDAO" />
          ??</property>
          ??<property name="boardDAO">
          ???<ref local="boardDAO" />
          ??</property>

          ?</bean>

          ?<bean name="/boardNavigate"
          ??class="com.lzy.forum.action.BoardNavigateAction" singleton="false">
          ??<property name="boardDAO">
          ???<ref local="boardDAO" />
          ??</property>

          ?</bean>

          ?<bean name="/boardDisplay"
          ??class="com.lzy.forum.action.BoardDisplayAction" singleton="false">
          ??<property name="boardDAO">
          ???<ref local="boardDAO" />
          ??</property>

          ?</bean>

          ?<bean name="/articleManage"
          ??class="com.lzy.forum.action.ArticleManageAction" singleton="false">
          ??<property name="userDAO">
          ???<ref local="userDAO" />
          ??</property>
          ??<property name="boardDAO">
          ???<ref local="boardDAO" />
          ??</property>
          ??<property name="articleDAO">
          ???<ref local="articleDAO" />
          ??</property>


          ?</bean>


          </beans>

          經過這樣的配置之后,Hibernate事務交由Spring管理,sessionFactory從Spring容器獲得。下面通過其中的一個DAO實例來看看這樣做帶來的方便。


          //BoardDAO.java

          package com.lzy.forum.dao;

          import java.util.ArrayList;

          import com.lzy.forum.domain.Board;

          public interface BoardDAO {
          ?
          ?public boolean isBoardExist(String name);
          ?
          ?public void addBoard(Board board);
          ?
          ?public void deleteBoard(Board board);
          ?
          ?public Board loadBoard(int id);
          ?
          ?public Board loadBoard(String name);
          ?
          ?public Board loadBoardWithArticles(int id);
          ?
          ?public ArrayList getRootBoardsList();
          ?
          ?
          ?
          }


          //BoardDAOHibernate.java

          package com.lzy.forum.dao.impl;

          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.ListIterator;
          import java.util.Set;

          import org.hibernate.Hibernate;
          import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          import com.lzy.forum.dao.BoardDAO;
          import com.lzy.forum.domain.Board;

          public class BoardDAOHibernate extends HibernateDaoSupport implements BoardDAO {

          ?public void deleteBoard(Board board) {
          ??// TODO Auto-generated method stub
          ??this.getHibernateTemplate().delete(board);
          ?}

          ?public void addBoard(Board board) {
          ??// TODO Auto-generated method stub
          ??this.getHibernateTemplate().saveOrUpdate(board);

          ?}

          ?public boolean isBoardExist(String name) {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board where name = ? ", new Object[] { name });
          ??if (list.size() > 0) {
          ???// System.out.println("find it");
          ???return true;
          ??}
          ??return false;
          ?}

          ?public Board loadBoard(int id) {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board where id = ? ", new Object[] { id });

          ??Board b = null;
          ??if (list.size() > 0) {
          ???b = (Board) list.get(0);
          ??}

          ??return b;
          ?}

          ?public Board loadBoard(String name) {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board where name = ? ", new Object[] { name });

          ??Board b = null;
          ??if (list.size() > 0) {
          ???b = (Board) list.get(0);
          ??}

          ??return b;
          ?}

          ?public ArrayList getRootBoardsList() {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board b left join fetch b.ChildBoards where b.Parent = null order by b.id");
          ??System.out.println(list.size() + " root boards found ");
          ??

          ??ListIterator index = list.listIterator();
          ??while (index.hasNext()) {

          ???Board s = (Board) index.next();
          ???//this.getSession(true);
          ???//Hibernate.initialize(s.getChildBoards());
          ???///*
          ??? Set children? = (Set) s.getChildBoards();
          ??? Iterator it = children.iterator();
          ???
          ??? while(it.hasNext()){
          ??? Board b = (Board)it.next();
          ??? //Hibernate.initialize(b);
          ??? System.out.println(b.getName());
          ??? }
          ??? //*/

          ???//System.out.println(children.size() + "child(ren) found ");
          ???//s.setChildBoards(s.getChildBoards());
          ??}

          ??return list;
          ?}

          ?public Board loadBoardWithArticles(int id) {
          ??// TODO Auto-generated method stub
          ??ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board b left join fetch b.Articles where b.Id = ? ", new Object[] { id });

          ??Board b = null;
          ??if (list.size() > 0) {
          ???b = (Board) list.get(0);
          ??}

          ??return b;

          ?}


          }


          BoardDAOHibernate繼承 HibernateDaoSupport后,通過getHibernateTemplate()得到一個HibernateTemplate實例,然后執行CRUD操作,非常簡單。需要注意的是,由于執行一次CRUD操作后,Hibernate session關閉,如果有使用延遲加載策略的對象沒有加載,在后面的Web層很容易出現如下錯誤:
          failed to lazily initialize a collection of role
          從網上搜到的解決方法是Open Session In View,
          <filter>
          ???? <filter-name>hibernateFilter</filter-name>
          ???? <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
          ???? </filter-class>

          ???? <!-- 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>
          我試了試,還是有一些問題,所以后來還是放棄了這種方法,所有在Web層中需要的對象都必須在Business層中加載完成。如下面的代碼所示:

          ArrayList list = (ArrayList) this.getHibernateTemplate().find(
          ????"from Board b left join fetch b.Articles where b.Id = ? ", new Object[] { id });


          這樣Hibernate和Spring的結合也算完成了。其他的一些DAO類和實現代碼我沒有給出,但是大同小異,和Board的實現類似。


          最后將是Struts 和Spring的結合,將在下一篇給出。

          前面通過PlugIn我們實現了Spring Context的加載,不過僅僅加載Context并沒有什么實際
          意義,我們還需要修改配置,將Struts Action交給Spring容器進行管理。下面將通過一個Regsit
          實例加以說明。

          首先準備好regist.jsp和login.jsp,在regist.jsp中 的form有name,password,password2,email域。

          在struts-config.xml中添加配置:

          <form-bean name="registForm" type="com.lzy.forum.form.RegistForm" />

          <action path="/regist" name="registForm"
          type="org.springframework.web.struts.DelegatingActionProxy"

          validate="true" input="/regist.jsp" scope="request">
          <forward name="failure" path="/regist.jsp" />
          <forward name="success" path="/login.jsp" />
          </action>


          RegistForm,RegistAction按照原來Struts的方法去寫,我在RegistAction中加入了一個UserDAO對象
          userDAO,這個對象由Spring注入。

          <bean name="/regist" class="com.lzy.forum.action.RegistAction"
          singleton="false">
          <property name="userDAO">
          <ref local="userDAO" />
          </property>
          </bean>

          基本上SSH的架構已經完成,經確認后可以自己測試一下了。

          posted on 2006-07-21 01:45 liaojiyong 閱讀(584) 評論(0)  編輯  收藏 所屬分類: Spring

          主站蜘蛛池模板: 广昌县| 巴青县| 嘉祥县| 高碑店市| 云和县| 芜湖市| 桐乡市| 昭觉县| 曲周县| 咸丰县| 洛南县| 元朗区| 章丘市| 新郑市| 临潭县| 丹凤县| 萨迦县| 犍为县| 三穗县| 黔西县| 黄梅县| 全南县| 开封县| 准格尔旗| 曲阳县| 延长县| 宜城市| 清水河县| 邻水| 新民市| 罗江县| 依安县| 日土县| 讷河市| 淳化县| 英超| 丰台区| 鸡西市| 江山市| 醴陵市| 镇坪县|