SSh中 一对多关联外键添加,修改保存失败问题

今天博主在做一个ssh项目时候,需要使用到一级分类和二级分类关联,然后是在保存二级分类的时候,二级分类的name可以正常保存,而二级分类关联的一级分类的cid不能插入老是为空。   憋了一天一夜终于把问题解决,,虽然不知道为撒,,但是个人感觉还是因为  关联问题的原因。。。首先建立各自的实体类:

public class Category implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer cid;
	private String cname;
	// 一级分类中存放二级分类的集合:
	private Set<CategorySecond> categorySeconds = new HashSet<CategorySecond>();
	
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public Set<CategorySecond> getCategorySeconds() {
		return categorySeconds;
	}

	public void setCategorySeconds(Set<CategorySecond> categorySeconds) {
		this.categorySeconds = categorySeconds;
	}
	
	
}

二级分类的实体类:

public class CategorySecond {
	private Integer csid;
	private String csname;
	// 所属一级分类.存的是一级分类的对象.
	private Category category;
	// 配置商品集合
	private Set<Product> products = new HashSet<Product>();
	public Integer getCsid() {
		return csid;
	}
	public void setCsid(Integer csid) {
		this.csid = csid;
	}
	public String getCsname() {
		return csname;
	}
	public void setCsname(String csname) {
		this.csname = csname;
	}
	public Category getCategory() {
		return category;
	}
	public void setCategory(Category category) {
		this.category = category;
	}
	public Set<Product> getProducts() {
		return products;
	}
	public void setProducts(Set<Product> products) {
		this.products = products;
	}
	
	
	
	
}

他们各自的配置文件如下:一级分类的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="shop.category.vo.Category" table="category">
		<id name="cid">
			<generator class="native"/>
		</id>
	
		<property name="cname"/>
		<!-- 配置二级分类的集合 ,每一次刷新之后都不变-->
		<set  name="categorySeconds" inverse="true" lazy="false"  order-by="csid" cascade="all"  >
			<!-- 外键 -->
			<key column="cid"/>
			<one-to-many class="shop.categorysecond.vo.CategorySecond"/>
		</set>
		
		
	</class>
</hibernate-mapping>
二级分类的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="shop.categorysecond.vo.CategorySecond" table="categorysecond">
		<id name="csid">
			<generator class="native"/>
		</id>
		
		<property name="csname"/>
		<!-- 二级分类与一级分类的关联 ....多的一端,是many,name是类这一段的属性,columu找表里的属性-->
		<many-to-one  name="category"  lazy="false" class="shop.category.vo.Category" column="cid"  ></many-to-one>
	
		<!-- 二级分类与商品的关联 -->
		<set name="products">
			<key column="csid"/>
			<one-to-many class="shop.product.vo.Product"/>
		</set>
	</class>
</hibernate-mapping>
此处使用一对多的set集合这种形式进行关联,,然后查阅网上原因的时候,特意加了下面的主控方和被空方问题    inverse="true"这个加在一对多的   一的那一方。

关于这个问题,还是没有解决我的问题。

然后又怀疑是级联问题,特意把级联加了进去  cascade=“all”,结果问题还是没有解决。

这是我的action,

package shop.categorysecond.adminaction;

import java.util.List;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.sun.org.apache.bcel.internal.generic.NEW;

import shop.category.service.CategoryService;
import shop.category.vo.Category;
import shop.categorysecond.service.CategorySecondService;
import shop.categorysecond.vo.CategorySecond;
import shop.utils.PageBean;

/**
 * 后台二级分类的对象
 * 
 * @author feng
 *
 */
public class AdminCategorySecondAction extends ActionSupport implements ModelDriven<CategorySecond> {
	/**
	 * 
	 */
	private CategorySecond categorySecond = new CategorySecond();
	@Override
	public CategorySecond getModel() {
		// TODO Auto-generated method stub
		return categorySecond;
	}

	// 注入二级分类的service
	private CategorySecondService categorySecondService;

	public void setCategorySecondService(CategorySecondService categorySecondService) {
		this.categorySecondService = categorySecondService;
	}

	// 接受page
	private Integer page;

	public void setPage(Integer page) {
		this.page = page;
	}
	//接受cid;;;;此处我也不知道为啥需要用一个这个才好使,,,因为在ad
	<span style="color:#ff0000;">/*private Integer cid;
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}*/</span>

	// 注入一级分类的Service
	private CategoryService categoryService;
	public void setCategoryService(CategoryService categoryService) {
		this.categoryService = categoryService;
	}

	// 查询二级分类的方法
	public String findAll() {
		PageBean<CategorySecond> pageBean = categorySecondService.findByPage(page);
		// 在service方法中我们已经获取到了pagebean 将pagebean放到值栈中
		ActionContext.getContext().getValueStack().set("pageBean", pageBean);
		return "findAll";

	}

	// 二级分类的添加页面:跳转
	public String addPage() {
		// 查询所有一级分类
		List<Category> cList = categoryService.findAll();
		// 把数据显示到页面的下拉列表中,保存到值栈
		ActionContext.getContext().getValueStack().set("cList", cList);
		// 页面跳转
		return "addPageSuccess";
	}

	// 保存二级分类的方法
	public String save() {
		<span style="color:#ff0000;">categorySecond.setCategory(categoryService.findByCid(cid));</span>
		categorySecondService.save(categorySecond);
		return "saveSuccess";
	}

	// 删除二级分类的方法:
	public String delete() {
		// 根据id查询二级分类:如果级联删除。先查询在删除,配置cascade。。。
		System.out.println(categorySecond.getCsid());
		categorySecond = categorySecondService.findByCsid(categorySecond.getCsid());
		categorySecondService.delete(categorySecond);
		return "deleteSuccess";
	}
	//编辑二级分类的方法
	public String edit(){
		//根据二姐分类id查询二级分类的对象
		categorySecond=categorySecondService.findByCsid(categorySecond.getCsid());
		//查询所有的一级分类
		List<Category> cList=categoryService.findAll();
		ActionContext.getContext().getValueStack().set("cList", cList);
		return "editPageSuccess";
	}
	// 修改二级分类的方法:
		public String update(){
			categorySecond.setCategory(categoryService.findByCid(cid));
			categorySecondService.update(categorySecond);
			return "updateSuccess";
		}

}

  然后是我的添加页面:
<body>
		<form id="userAction_save_do" name="Form1" action="${pageContext.request.contextPath}/adminCategorySecond_save.action" method="post" enctype="multipart/form-data">
			 
			<table cellSpacing="1" cellPadding="5" width="100%" align="center" bgColor="#eeeeee" style="border: 1px solid #8ba7e3" border="0">
				<tr>
					<td class="ta_01" align="center" bgColor="#afd1f3" colSpan="4"
						height="26">
						<strong><STRONG>添加二级分类</STRONG>
						</strong>
					</td>
				</tr>

				<tr>
					<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
						二级分类名称:
					</td>
					<td class="ta_01" bgColor="#ffffff">
						<input type="text" name="csname" value="" id="userAction_save_do_logonName" class="bg"/>
					</td>
					
					<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
						所属的一级分类:
					</td>
					<span style="color:#cc0000;"><td class="ta_01" bgColor="#ffffff">
						<select name="cid">
						<s:iterator value="cList" var="c">
						<option value="<s:property value="#c.cid"/>" ><s:property value="#c.cname"/> </option>
						</s:iterator>
						</select>
					</td></span>
					
				</tr>
			
				<tr>
					<td class="ta_01" style="WIDTH: 100%" align="center"
						bgColor="#f5fafe" colSpan="4">
						<button type="submit" id="userAction_save_do_submit" value="确定" class="button_ok">
							确定
						</button>

						<FONT face="宋体">       </FONT>
						<button type="reset" value="重置" class="button_cancel">重置</button>

						<FONT face="宋体">       </FONT>
						<INPUT class="button_ok" type="button" οnclick="history.go(-1)" value="返回"/>
						<span id="Label1"></span>
					</td>
				</tr>
			</table>
			
			
	
		</form>
		
					
	
			
		
		
	</body>
dao层和service层一级配置文件和struts.xml经楼主检查没有错误,便不在贴出来了。

楼主的最终解决办法,可以看到在action中有一段用红色标记的注释掉的内容,开始是没有的,后来添加上,,就好使了。具体原因我也不知道为啥。

但是此处我还是有很多疑惑,希望各位大神为我解答:

1.在action中我是用modelDriven之后,本来可以用模型categorySecond直接接收数据的,但是这里为什么没有接受到一级分类中的cid,而是需要我自己去重新定义这样一个id,然后set,get呢。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值