组合关系:就是强聚合,双向的多对一、一对多,他们之间是不能分割的。
在JPA中组合关系的配置:级联,级联要么不配,要么就配置最强的:all+孤儿删除
在单据的地方可配置级联+孤儿删除
UML,如果是实心的菱形,就是组合关系,如果是空心的菱形就是聚合关系。
要想整体和部分不可分割,代码就要配置级联。
一对多,性能超级差
双向一对多的话,就要让一方放弃关系维护,才能提高性能。
组合关系-采购订单模型
分析表字段:
1、每个字段的意思
2、这个字段的类型(为什么要用这个类型)
3、字段是否可以为空
4、这个字段的值应该从哪里来
配置采购单关系
private Date vdate;
private BigDecimal totalamount;
private BigDecimal totalnum;
private Date inputtime=new Date();
private Date auditortime;
// 状态
private Integer status=0;
// 与 供应商的表关系
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "supplier_id")
private Supplier supplier;
// 与审核人的关系
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "auditor_id")
private Employee auditor;
// 与录入员的关系
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "inputUser_id")
private Employee inputuser;
// 与采购员的关系
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "buyer_id")
private Employee buyer;
// 一般组合关系使用list
@OneToMany(cascade = CascadeType.ALL,mappedBy = "bill",fetch = FetchType.LAZY,orphanRemoval = true)
private List<Purchasebillitem> items=new ArrayList<>();
配置采购详单关系
private BigDecimal price;
private BigDecimal num;
private BigDecimal amount;
private String descs;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id")
private Product product;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "bill_id")
// 表示不用理他
@JsonIgnore
private Purchasebill bill;
purchasebill.jsp
表格部分
<tr>
<th data-options="field:'vdate',width:100">交易时间</th>
<th data-options="field:'totalamount',width:100">总金额</th>
<th data-options="field:'totalnum',width:100">总数量</th>
<th data-options="field:'inputtime',width:100">录入时间</th>
<th data-options="field:'supplier',width:100,formatter:formatName">供应商</th>
<th data-options="field:'auditor',width:100,formatter:formatName">审核人</th>
<th data-options="field:'inputuser',width:100,formatter:formatName">录入人</th>
<th data-options="field:'buyer',width:100,formatter:formatName">采购员</th>
<th data-options="field:'status',width:100,formatter:formatStatus">状态</th>
</tr>
高级查询部分
<div>
<form id="searchForm">
交易时间:
<input name="beginDate" class="easyui-datebox" style="width:120px"/>--
<input name="endDate" class="easyui-datebox" style="width:120px"/>
状态:
<select class="easyui-combobox" panelHeight="auto" name="status" style="width:120px;">
<option value="">--请选择--</option>
<option value="0">待审核</option>
<option value="1">已审核</option>
<option value="-1">已废除</option>
</select>
<a href="javascript:;" data-method="search" class="easyui-linkbutton" iconCls="icon-search">查询</a>
</form>
</div>
使前台显示的交易时间为我们定义的格式
我们用一个easyUI的日历插件来获取时间,设置日期格式,加上东八区
//添加下面的注解,进行时间配置,使前台显示的交易时间为我们定义的格式
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
public Date getVdate() {
return vdate;
}
提醒自己:jsp表格里面的field必须和domain里面配置的字段一样
做高级查询
后台接受前台的数据
PurchasebillQuery,get/set,
private String name;
// 查询的开始时间
private Date beginDate;
// 查询的结束时间
private Date endDate;
// 状态
private Integer status;
//这里帮我们直接返回Specification这个对象
//StringUtils.isNotBlank(stru):不为空且不是空字符串
// ge:大于等于,le:小于等于,lt:小于
@Override
public Specification createSpec(){
// 想在采购单管理表里面的高级查询里面,选择查询一天之内任何时间的数据,lang3给我们提供了这个方法
// 先在结束时间上加一天
Date addDays=null;
if(endDate!=null){
addDays = DateUtils.addDays(endDate, 1);
}
Specification spec = Specifications.and()
.like(StringUtils.isNotBlank(name),“name”, “%”+name+"%")
.ge(beginDate!=null,“vdate” ,beginDate )
// 为了能够实现可以查询一天内的所有数据,下面还要将上面加1的字段写入
.lt(endDate!=null,“vdate” ,addDays )
.eq(status!=null,“status”,status)
.build();
return spec;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBeginDate() {
return beginDate;
}
// 在SpringMVC里面,要想接收一个日期参数,需要在set上面加上一个下面的注解,并配置格式
@DateTimeFormat(pattern = “yyyy-MM-dd”)
public void setBeginDate(Date beginDate) {
this.beginDate = beginDate;
}
public Date getEndDate() {
return endDate;
}
// 在SpringMVC里面,要想接收一个日期参数,需要在set上面加上一个下面的注解,并配置格式
@DateTimeFormat(pattern = "yyyy-MM-dd")
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
小知识:400错误,表示参数类型出错。
SpringMVC接受日期参数
在SpringMVC里面,如果想要接受一个日期参数,要set上面加一个下面的注解@DateTimeFormat
后台的数据传到前台
在做高级查询的时候,时间选择我们使用日历,直接将class改成下图所示就可以了
设计高级查询
在设计高级查询的时候,做一个下拉框,在后台写死
调节下拉框的长度(panelHeight)