本文主要是介绍一对多关系映射应用之二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
正向的一对多关系,一般只应用在下拉列表中,通过关联来动态生成多级的下拉列表。
后台完成查询全部省份的方法,在页面上加入超连接。
<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 ( |
下面完成多对一部分的修改:
添加功能:
由于需要选择所在分类,因此要先编写一个查询全部分类的功能。
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> |
这篇关于一对多关系映射应用之二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!