(经典)Hibernate多对一关系映射(四)

来源:互联网 发布:java开发好学吗 编辑:程序博客网 时间:2024/05/11 21:38

多对一关系主要应用在添加,修改,列表上,删除功能用不到多对一关系。(实际开发中多对一的应用较多)

例:这里多加入一张新闻类型表,完成新闻的分类功能。

在新闻表中多加入一个分类的字段,表示该新闻属于某一类。

新闻类型是 一, 新闻是 多。

实现的效果:


建立数据库表:

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
  1. CREATE TABLE news_type (  
  2.        tid                      number(8)           primary key ,  
  3.        tname                    varchar2(50)        not null                      
  4. );  
  5. INSERT INTO news_type VALUES (1,'经济');  
  6. INSERT INTO news_type VALUES (2,'军事');  
  7. INSERT INTO news_type VALUES (3,'娱乐');  
  8. INSERT INTO news_type VALUES (4,'游戏');  
  9. INSERT INTO news_type VALUES (5,'广告');  
  10. CREATE TABLE news (  
  11.        id                       number(8)           primary key ,  
  12.        title                    varchar2(50)        not null,  
  13.        content                  varchar2(500)       not null,  
  14.        pub_date                 date                not null,  
  15.        type_id                  number(8)           not null,  
  16.        foreign key (type_id) references news_type (tid) on delete cascade   
  17. );  
  18. commit;  

下面生成映射,完成一对多关系配置,这里上篇博客详细介绍了。

数据库操作与之前没有变化,因此可以继续使用之前的代码。

一、先来看添加功能

由于多了一个选择新闻分类的操作,因此在进入添加页前,需要先查询出所有的分类信息,也就是要先在后台完成NewsType的查询全部的功能。

实际开发中,每个功能模块会对应一个Action,同时对应一个Service,而并不是一个DAO对应一个Service。Service主要处理的是业务逻辑,是根据当前功能,组合调用DAO来完成数据操作。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">  </span>public List<NewsType> insertPre() {  
  2.         List<NewsType> all = null;  
  3.         try {  
  4.             all = DAOFactory.getINewsTypeDAOInstance().findAll();  
  5.         } catch (Exception e) {  
  6.             e.printStackTrace();  
  7.         } finally {  
  8.             HibernateSessionFactory.closeSession();  
  9.         }  
  10.         return all;  
  11.     }  
修改超连接,不能直接进入insert.jsp了,必须先进入Action查询出全部分类,再进入jsp完成下拉列表的显示。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <a href="news!insertPre.action">添加新闻</a>  

在Action中加入insertPre的方法,并完成查询

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">  </span>// 取得所有的新闻分类列表  
  2.     private List<NewsType> allType;  
  3.   
  4.     public String insertPre() throws Exception {  
  5.   
  6.         allType = ServiceFactory.getINewsServiceInstance().insertPre();  
  7.   
  8.         return "insert";  
  9.     }  
配置struts:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <result name="insert">/pages/news/news_insert.jsp</result>  

页面上循环列表,显示出下拉列表数据。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">      </span><center>  
  2.             <form action="news!insert.action" method="post">  
  3.                 新闻标题:  
  4.                 <input type="text" name="news.title" />  
  5.                 <br />  
  6.                 新闻内容:  
  7.                 <input type="text" name="news.content" />  
  8.                 <br />  
  9.                 发布日期:  
  10.                 <input type="text" name="news.pubDate" />  
  11.                 <br />  
  12.                 <span style="color:#cc0000;">所属分类:  
  13.                 <select name="news.newsType.tid">  
  14.                     <option value="0">-请选择分类-</option>  
  15.                     <c:forEach var="t" items="${allType}">  
  16.                         <option value="${t.tid}">${t.tname }</option>  
  17.                     </c:forEach>  
  18.                 </select></span>  
  19.                 <br/>  
  20.                 <input type="submit" value="添加" />  
  21.             </form>  
  22.         </center>  

一样会出现懒汉式异常,需要在映射文件中加入lazy=”false”,这里的懒汉式异常,可能会包的是数据无法识别NumberFormatException。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">  </span><many-to-one name="newsType" lazy="false" class="org.liky.pojo.NewsType" fetch="select">  
  2.             <column name="TYPE_ID" precision="8" scale="0" not-null="true" />  
  3.         </many-to-one>  

二、处理修改功能

进入修改页时,不只要查询新闻的数据,还要查询所有新闻分类的信息,以便实现下拉列表。


因此Service方法需要修改。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">  </span>public Map<String, Object> updatePre(int id) {  
  2.         Map<String, Object> map = new HashMap<String, Object>();  
  3.         try {  
  4.             map.put("news", DAOFactory.getINewsDAOInstance().findById(id));  
  5.             map.put("allType", DAOFactory.getINewsTypeDAOInstance().findAll());  
  6.         } catch (Exception e) {  
  7.             e.printStackTrace();  
  8.         } finally {  
  9.             HibernateSessionFactory.closeSession();  
  10.         }  
  11.         return map;  
  12.     }  
在Action中完成调用。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public String updatePre() throws Exception {  
  2.         Map<String, Object> map = ServiceFactory.getINewsServiceInstance()  
  3.                 .updatePre(news.getId());  
  4.   
  5.         news = (News) map.get("news");  
  6.         allType = (List<NewsType>) map.get("allType");  
  7.         return "update";  
  8.     }  

页面上显示

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="white-space:pre">          </span><form action="news!update.action" method="post">  
  2.                 新闻标题:  
  3.                 <input type="text" name="news.title" value="${news.title }"/>  
  4.                 <br />  
  5.                 新闻内容:  
  6.                 <input type="text" name="news.content" value="${news.content }"/>  
  7.                 <br />  
  8.                 发布日期:  
  9.                 <input type="text" name="news.pubDate" value="${news.pubDate }"/>  
  10.                 <br />  
  11.                 <span style="color:#cc0000;">所属分类:  
  12.                 <select name="news.newsType.tid">  
  13.                     <option value="0">-请选择分类-</option>  
  14.                     <c:forEach var="t" items="${allType}">  
  15.                         <option value="${t.tid }" ${t.tid==news.newsType.tid?"selected":"" }></span>  
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="color:#cc0000;"><span style="white-space:pre">                         </span>${t.tname }</option>  
  2.                     </c:forEach>  
  3.                 </select></span>  
  4.                 <br/>  
  5.                 <input type="hidden" name="news.id" value="${news.id }"/>  
  6.                 <input type="submit" value="修改" />  
  7.             </form>  
附:通过简单的事例说明清楚Hibernate在处理一对多,多对一中的方式方法,有哪些区别。一对多应用通常表现在动态的级联关系上(js也能做到,但是却是静态的);多对一关系通常在插入,修改,查询时,作为一列属性加入到数据库中的。
0 0
原创粉丝点击