SSh中 一对多关联外键添加,修改保存失败问题
2016-11-10 14:35
387 查看
今天博主在做一个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 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;
}
}
他们各自的配置文件如下:一级分类的配置文件
此处使用一对多的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";
}
}
然后是我的添加页面:
dao层和service层一级配置文件和struts.xml经楼主检查没有错误,便不在贴出来了。
楼主的最终解决办法,可以看到在action中有一段用红色标记的注释掉的内容,开始是没有的,后来添加上,,就好使了。具体原因我也不知道为啥。
但是此处我还是有很多疑惑,希望各位大神为我解答:
1.在action中我是用modelDriven之后,本来可以用模型categorySecond直接接收数据的,但是这里为什么没有接受到一级分类中的cid,而是需要我自己去重新定义这样一个id,然后set,get呢。
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> 4000 <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" onclick="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呢。
相关文章推荐
- 问题二-jsp页面几个常用操作(添加一行、删除、取消修改、保存、修改)-js代码(OK)
- openerp学习笔记 计算字段、关联字段(7.0中非计算字段、关联字段只读时无法修改保存的问题暂未解决)
- hibernate一对多、多对多级联保存与级联删除与修改外键
- Entity Framework Code First添加修改及删除外键关联实体
- Entity Framework Code First添加修改及删除外键关联实体
- SSH开发问题-修改页面校验失败后返回原来页面(非OGNL)
- 解决input原本保存的内容不能修改,但可以添加的问题
- hibernate 一对一、多对一 双向关联的问题——只能在多的一方添加、修改数据,不能在多的一方修改添加
- Ado.NET 记录的添加、修改、删除!问题得到解决了!!!
- ssh 配置互信失败可能遇到的问题。
- TFS二次开发系列:四、TFS二次开发WorkItem添加和修改、保存
- Android SDK tools安装失败, Win7修改保存Hosts提示没有管理员权限的解决办法
- 解决windows下eclipse中android项目关联android library project失败问题
- mysql处理添加外键时 error 150 问题 (zz)
- 修改hosts失败的问题
- 解决SqlServer2008修改表后保存时出现“save changes is not permitted…”问题
- Entity FrameWork对有外键关联的数据表的添加操作
- Android之Toolbar的三个问题:修改左边箭头颜色、怎样修改右边以及子activity中的toolbar添加返回箭头
- Toolbar的三个问题:修改左边箭头颜色、怎样修改右边以及子activity中的toolbar添加返回箭头
- 解决ext htmleditor 回车,或者居中,设置一下字体颜色,就信息保存失败问题