jpa多对多+中间表的查询,删除,添加操作
实体类数据库如下:
表单类
资产类
中间表:为双主键模式,head_id为表单
实体类(维护方)如下:
@Entity
@Table(name="t_amc_asset_head")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AssetHead extends BaseEntity {
private static final long serialVersionUID = 1L;
@Temporal(TemporalType.DATE)
@DateTimeFormat( pattern = "yyyy-MM-dd")
@Column(name = "head_time")
Date headTime;//领用时间
@ManyToOne
@JoinColumn(name = "user_id")
private UserInCompany userInCompany;//关联 ?
@Column(name = "user_name")
String UserName;//领用人
@Column(name = "head_position")
String headPosition;//领用位置
@Column(name = "head_ps")
String headPS;//领用备注
@Column(name = "head_status")
String headStatus;//领用状态 0:new 1 :锁定
@Column(name = "label_id")
String labelId;//资产编号
@Column(name = "asset_name")
String assetName;//资产名称
//多对多
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name = "middle_asset_head", joinColumns = { @JoinColumn(name = "head_id") }, inverseJoinColumns = { @JoinColumn(name = "label_id") })
/* 加载策略定义 */
@Fetch(FetchMode.SUBSELECT)
/* 缓存策略 */
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<Asset> assetList;
collection 增删查如下:
新增
/**
* 新建需要在状态未使用的资产才可以执行操作
*
* @param assethead
*
* @return
*/
@RequestMapping(value = "save", method = RequestMethod.POST)
@ResponseBody
public AjaxMessage save(@RequestParam("assethead")String assethead,@RequestParam("ids[]")String ids[]) throws ParseException {
//添加领用单
String bb=assetHead.get("headTime").toString();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(bb);
AssetHead assetHead1=new AssetHead();
assetHead1.setUserInCompany(userInCompanyService.findOne((String)assetHead.get("userInCompany.tid")));
assetHead1.setUserName((String)assetHead.get("userName"));
assetHead1.setHeadPS((String)assetHead.get("headPS"));
assetHead1.setHeadPosition((String)assetHead.get("headPosition"));
assetHead1.setHeadTime(date);
assetHead1.setHeadStatus("0");
assetHeadService.save(assetHead1);//添加到领用单
List<Asset> assetList=new ArrayList<Asset>();
for (int i = 0;i < ids.length; i++) {//
Asset asset=new Asset();
asset=assetService.findOne(splits[i]);
asset.setUseStatus("locking");
assetService.save(asset);
assetList.add(asset);
}
AssetHead Assethead= assetHeadService.findOne(assetHead1.getTid());//多对多中间表,先获取维护方的对象
if(Assethead!=null) {//判断对象是否为空
if(Assethead.getAssetList()==null){
Assethead.setAssetList(Lists.newArrayList());
}
Assethead.getAssetList().addAll(assetList);//对象不为空,向中间表添加全部记录
}
assetHeadService.save(Assethead);//保存中间表操作
return AjaxMessage.createSuccessMsg();
}
/**
* 删除
*
* @param id
* @return
*/
//@PreAuthorize("hasRole('ROLE_AssetsourceListDelete')")
@RequestMapping(value = "delete/{id}", method = RequestMethod.POST)
@ResponseBody
public AjaxMessage delete(@PathVariable("id") String id) {
//解放资产
AssetHead assetHead=assetHeadService.findOne(id);
List<Asset> assetList=new ArrayList<Asset>();
if(assetHead!=null) {
if(assetHead.getAssetList()==null){
assetHead.setAssetList(Lists.newArrayList());
}
assetList=assetHead.getAssetList();
}
for (Asset asset:assetList) {//对中间表资源全部释放
asset.setUseStatus("unused");
System.out.println("!!!!!!!!!!!!!!!!!!!!!对中间表资源全部释放!!!!!!!!!!!!!"+asset);
assetService.save(asset);
}
//删除中间表
assetHead.getAssetList().removeAll(assetHead.getAssetList());
assetHeadService.save(assetHead);
assetHeadService.deleteByLogic(id);//删除领用单
return AjaxMessage.createSuccessMsg();
}
/**
* 跳转修改页
* @param id
* @param model
* @return
*/
@RequestMapping(value = "use/{id}")//领用修改
public String edit(@PathVariable("id") String id,Model model) {
model.addAttribute("assethead", assetHeadService.findOne(id));//查询领用单
AssetHead assetHead= assetHeadService.findOne(id);
List<Asset> assetList=new ArrayList<Asset>();
if(assetHead!=null) {
if(assetHead.getAssetList()==null){
assetHead.setAssetList(Lists.newArrayList());//通过中间表,查询领用单对应的所有资源单
}
assetList=assetHead.getAssetList();
}
model.addAttribute("assetList",assetList);
return "amc/assethead/edit";
}
最后:修改就是将删除和添加结合起来