一对多关系映射应用之二

2024-08-31 13:18

本文主要是介绍一对多关系映射应用之二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正向的一对多关系,一般只应用在下拉列表中,通过关联来动态生成多级的下拉列表。

后台完成查询全部省份的方法,在页面上加入超连接。

       <center>

           <a href="province!list.action">显示一对多列表</a>

       </center>


在Action中完成查询和传递数据的操作。

public class ProvinceAction extends ActionSupport {

 

    private List<Province> allProvince;

 

    public String list() throws Exception {

       allProvince = ServiceFactory.getIProvinceServiceInstance().list();

 

       return "list";

    }

 

    <package name="root" namespace="/" extends="struts-default">

       <action name="province" class="org.liky.otm.action.ProvinceAction">

           <result name="list">/pages/province/province_list.jsp</result>

       </action>

    </package>


测试时,会提示懒汉式加载异常,因为在页面上才查询城市信息。

为了解决这个问题,可以使用以下两种方法:

1)  不关闭连接(不推荐)

2)  不使用懒汉式,需要在映射文件中修改。

<set name="cities" lazy="false" inverse="true">       

同时,测试时还会发现,顺序会随机改变,这就需要也修改映射文件,设置关联对象的排序顺序。

<set name="cities" lazy="false" order-by="id desc" inverse="true">       

省份选项还可以改为以下形式

           <select>

              <c:forEach var="p" items="${allProvince}">

                  <optgroup label="${p.title }"></optgroup>

                  <c:forEach var="c" items="${p.cities}">

                     <option value="${c.id }"> |- ${c.title }</option>

                  </c:forEach>

               </c:forEach>

           </select>


如果是反向多对一的功能,在所有的添加,修改和查询操作中,都会有区别。

这里新建立一张 新闻类型表,同时,在新闻表中加入一个 所属分类的字段。

这样,新闻和新闻类型之间存在一对多关系。

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

建表语句:

CREATE TABLE news_type (
       tid              number(8)           primary key ,
       tname            varchar2(50)        not null
);

INSERT INTO news_type VALUES (1,'军事');
INSERT INTO news_type VALUES (2,'政治­');
INSERT INTO news_type VALUES (3,'艺术');
INSERT INTO news_type VALUES (4,'文学');
INSERT INTO news_type VALUES (5,'体育');

DROP TABLE news ;

CREATE TABLE news (
       id              number(8)            primary key ,
       title           varchar2(50)         not null,
       content         varchar2(500)        not null,
       pub_date        date                 not null,
       type_id         number(8)            not null,
       foreign key (type_id) references news_type (tid) on delete cascade
);

COMMIT;

根据表,生成映射,替换原有的News信息





下面完成多对一部分的修改:

 

添加功能:

由于需要选择所在分类,因此要先编写一个查询全部分类的功能。

    public List<NewsType> insertPre() throws Exception {

       List<NewsType> allType = null;

       try {

           allType = DAOFactory.getINewsTypeDAOInstance().findAll();

       } catch (Exception e) {

           e.printStackTrace();

           throw e;

       } finally {

           HibernateSessionFactory.closeSession();

       }

       return allType;

    }

这里要注意,由于编写的功能是:新闻管理,因此所有的Service操作都应该写到NewsService中,并没有规定必须在NewsService调用NewsDAO,NewsTypeService里调用NewsTypeDAO,Service与DAO并不是绑定到一起的。

 

修改超连接。

<a href="news!insertPre.action">添加新闻</a>

<br />       

在Action中添加一个insertPre的操作方法:

    // 所有新闻分类的信息

    private List<NewsType> allType;

 

    public String insertPre() throws Exception {

       allType = ServiceFactory.getINewsServiceInstance().insertPre();

      

       return "insert";

    }

<result name="insert">/pages/news/news_insert.jsp</result>    

修改insert.jsp,加入一个下拉列表选择分类。

           <form action="news!insert.action" method="post">

              新闻标题:<input type="text" name="news.title" /> <br/>

              新闻内容:<input type="text" name="news.content" /> <br/>

              新闻发布日期:<input type="text" name="news.pubDate" /> <br/>

              新闻分类:<select name="news.newsType.tid">

                  <option value="0">-请选择分类-</option>

                  <c:forEach var="t" items="${allType}">

                     <option value="${t.tid }">${t.tname }</option>

                  </c:forEach>

              </select>

              <br/>

              <input type="submit" value="添加"/>

           </form>

注意:下拉列表的 name 对应 news中的newsType里的tid。

 

列表显示时,也可以显示出新闻对应的分类信息。

                     <td>

                         ${news.newsType.tname }

                     </td>

测试时也会提示懒汉式异常,也需要修改配置文件,这次修改的是News.hbm.xml

        <many-to-one name="newsType" lazy="false" class="org.liky.pojo.NewsType" fetch="select">

            <column name="TYPE_ID" precision="8" scale="0" not-null="true" />

        </many-to-one>

修改功能中,由于也要显示下拉列表,因此在Service里需要查询两部分内容:新闻的信息,所有新闻分类信息。

    public Map<String, Object> updatePre(int id) throws Exception {

       Map<String, Object> map = new HashMap<String, Object>();

       try {

           map.put("news", DAOFactory.getINewsDAOInstance().findById(id));

           map.put("allType", DAOFactory.getINewsTypeDAOInstance().findAll());

       } catch (Exception e) {

           e.printStackTrace();

           throw e;

       } finally {

           HibernateSessionFactory.closeSession();

       }

       return map;

    }

因此Service中需要实现一个修改前的预处理操作。

修改Action中的操作

    public String updatePre() throws Exception {

       Map<String, Object> map = ServiceFactory.getINewsServiceInstance()

              .updatePre(news.getId());

       news = (News) map.get("news");

       allType = (List<NewsType>) map.get("allType");

 

       return "update";

    }

修改页面

           <form action="news!update.action" method="post">

              新闻标题:<input type="text" name="news.title" value="${news.title }"/> <br/>

              新闻内容:<input type="text" name="news.content" value="${news.content }"/> <br/>

              新闻发布日期:<input type="text" name="news.pubDate" value="${news.pubDate }"/> <br/>

              新闻分类: <select name="news.newsType.tid">

                  <option value="0">-请选择分类-</option>

                  <c:forEach var="t" items="${allType}">

                     <option value="${t.tid}" ${t.tid==news.newsType.tid?"selected":"" }>${t.tname }</option>

                  </c:forEach>

              </select>

              <br/>

              <input type="hidden" name="news.id" value="${news.id }"/>

              <input type="submit" value="修改"/>

           </form>





































这篇关于一对多关系映射应用之二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124014

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p