一对多关系映射应用之二

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

相关文章

Java中自旋锁与CAS机制的深层关系与区别

《Java中自旋锁与CAS机制的深层关系与区别》CAS算法即比较并替换,是一种实现并发编程时常用到的算法,Java并发包中的很多类都使用了CAS算法,:本文主要介绍Java中自旋锁与CAS机制深层... 目录1. 引言2. 比较并交换 (Compare-and-Swap, CAS) 核心原理2.1 CAS

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

springboot+mybatis一对多查询+懒加载实例

《springboot+mybatis一对多查询+懒加载实例》文章介绍了如何在SpringBoot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局... 目录springboot+myBATis一对多查询+懒加载parent相关代码child 相关代码懒

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

SpringMVC配置、映射与参数处理​入门案例详解

《SpringMVC配置、映射与参数处理​入门案例详解》文章介绍了SpringMVC框架的基本概念和使用方法,包括如何配置和编写Controller、设置请求映射规则、使用RestFul风格、获取请求... 目录1.SpringMVC概述2.入门案例①导入相关依赖②配置web.XML③配置SpringMVC

Elasticsearch 的索引管理与映射配置实战指南

《Elasticsearch的索引管理与映射配置实战指南》在本文中,我们深入探讨了Elasticsearch中索引与映射的基本概念及其重要性,通过详细的操作示例,我们了解了如何创建、更新和删除索引,... 目录一、索引操作(一)创建索引(二)删除索引(三)关闭索引(四)打开索引(五)索引别名二、映射操作(一

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2