domain关系配置
- 采购订单设计表时用组合股关系(强聚合:双向的多对一,一对多),一般用最强级联+孤儿删除+放弃关系维护权(
cascade ,orphanRemoval ,mappedBy
) - 需求:多方能找到一方、一方也能找到多方
-
Purchasebillding订单
Purchasebillitem订单明细
1 @OneToMany(cascade = CascadeType.ALL,orphanRemoval = true,mappedBy = "bill") 2 private List<Purchasebillitem> items=new ArrayList<>();
1 @ManyToOne(fetch = FetchType.LAZY,optional = false) 2 @JoinColumn(name="bill_id") 3 @JsonIgnore//两类互相调用,会出现死循环(生成JSON的时候忽略此字段) 4 private Purchasebill bill;
2.对于日期字段的配置
1 //前台日期展示格式设置 2 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 3 public Date getVdate() { 4 return vdate; 5 } 6 //前台传入后台格式设置(类型不对应浏览器会报400错误) 7 @DateTimeFormat(pattern = "yyyy-MM-dd") 8 public void setVdate(Date vdate) { 9 this.vdate = vdate; 10 }
query层的查询
分析:查询时间应该是 起始时间 <=查询时间 <结束时间+1
1 public class PurchasebillQuery extends BaseQuery{ 2 3 private Date beginTime; 4 private Date endTime; 5 private Integer status; 6 7 //高级查询 8 @Override 9 public Specification createSpec() { 10 Date date=null; 11 if(endTime !=null){ 12 //利用long3包的时间工具,当前时间+1天 13 date = DateUtils.addDays(endTime, 1); 14 } 15 Specification<Purchasebill> specification = Specifications.<Purchasebill>and() 16 //大于等于起始时间 17 .ge(beginTime!=null,"vdate", beginTime) 18 //小于终止时间+1 19 .lt(date!=null,"vdate",endTime ) 20 //状态 21 .eq(status!=null,"status",status) 22 .build(); 23 return specification; 24 } 25 }
前台页面与后台代码的结合
1.对于关联表的字段显示 配置属性 formatter="formatName"
1 <th width="20" field="supplier" formatter="formatName">供应商</th>
1 function formatName(value,row,index) { 2 return value?(value.name||value.username):"";//对于有多个字段的可以配置 value?(value.name||value.username):"" 返回第一个为true的值
3 }
2.下拉框
name为表内字段.id ,panelHeight:自适应长度,textField:显示的内容字段,url:内容查询路径
1 <input name="supplier.id" class="easyui-combobox" panelHeight="auto" style="width:120px" 2 data-options="required:true,valueField:'id',textField:'name',url:'/util/supplierList'"/></td>
3.form表单的格外参数提交
1 $('#purchasebillForm').form('submit', { 2 url: url, 3 onSubmit: function (param) { 4 //提交form表单外的数据 5 //获取所有行 6 var rows=dg.datagrid("getRows"); 7 for(let i in rows){ 8 var row=rows[i];//获取每行数据 9 param[`items[${i}].product.id`]=row.product.id; //提交参数格式 param["集合[i].字段"]=row.字段 10 param[`items[${i}].num`]=row.num; 11 param[`items[${i}].price`]=row.price; 12 param[`items[${i}].descs`]=row.descs; 13 } 14 } 15 } )
4.回显操作
1 var row =purchasebillDataGrid.datagrid("getSelected"); 2 if(!row){ 3 $.messager.alert('提示','请选中一行','info'); 4 return; 5 } 6 //打开对话框 7 purchasebillDia.dialog("open"); 8 //清除表单数据 9 purchasebillForm.form("clear"); 10 if(row.supplier){ 11 row["supplier.id"]=row.supplier.id;//下拉框的回显 12 }16 //加载form表单 17 purchasebillForm.form("load",row); 18 //加载datagrid 19 var newItems=[...row.items];//复制 20 dg.datagrid("loadData",newItems);//弹出框的回显 (需要备份 items和loadDatag公用一份数据)
保存时组合关系确认
1 private AjaxResult saveOrUpdate(Purchasebill purchasebill){ 2 try { 3 //一方找多方 4 List<Purchasebillitem> items = purchasebill.getItems(); 5 for (Purchasebillitem item:items){ 6 //多方找一方 7 item.setBill(purchasebill); 8 } 9 //保存 10 purchasebillService.save(purchasebill); 11 } catch (Exception e) { 12 e.printStackTrace(); 13 return new AjaxResult(false, e.getMessage()); 14 } 15 return new AjaxResult(); 16 }
修改时数据的丢失问题
配置注解:
@ModelAttribute("purchasebillEdit")将关联字段设置为null
@ModelAttribute("purchasebillEdit")Purchasebill purchasebill
1 //解决数据丢失问题 2 2 @ModelAttribute("purchasebillEdit") 3 3 public Purchasebill beforeEdit(Long id,String cmd){ 4 4 if(id!=null && "only".equals(cmd)){ 5 5 //只有修改操作才进此方法 6 6 Purchasebill dbPurchasebill= purchasebillService.findOne(id); 7 7 //将关联表的值设为null 8 8 dbPurchasebill.setSupplier(null); 9 9 return dbPurchasebill; 10 10 } 11 11 return null; 12 12 } 13 13 @RequestMapping("/update") 14 14 @ResponseBody 15 15 public AjaxResult update(@ModelAttribute("purchasebillEdit")Purchasebill purchasebill){ 16 16 return saveOrUpdate(purchasebill); 17 17 }