项目笔记:原始方法实现一对多数据库关联关系
一、一对多关系建立:一条策略对应多条规则:
策略XML和实体:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.vrv.paw.domain">
<class name="GenuineManagement" table="vrv_paw_genuineManagement">
<cache usage="transactional" />
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="policyName" type="string" length="32" />
<property name="method" type="integer" />
<property name="flag" type="integer" />
<property name="isPublish" type="boolean"/>
<property name="pubAreaRange" type="string" length="255" />
<property name="pubAreaTxt" type="text" />
<property name="publishArea" type="text" />
<property name="publishGroup1" type="text" />
<property name="publishGroup2" type="text" />
<property name="publishDevice" type="text" />
<property name="publishTime" type="timestamp" />
</class>
</hibernate-mapping>
public class GenuineManagement implements Serializable {
private static final long serialVersionUID = -5449557095173090598L;
//序号
private Integer id;
//策略名称
private String policyName;
//管控措施:0/1/2/3
private Integer method;
//是否开启管控:检查0、管控1
private Integer flag;
//是否发布
private Boolean isPublish;
/** 发布区域机构代码 */
private String pubAreaRange;
/** 发布区域名称 */
private String pubAreaTxt;
/** 发布区域 **/
private String publishArea;
/** 发布组 **/
private String publishGroup1;
/** 发布组 **/
private String publishGroup2;
/** 发布设备**/
private String publishDevice;
/** 发布时间**/
private Timestamp publishTime;
//规则库集合
private List<ControlMeasures> controlMeasuresList;
public List<ControlMeasures> getControlMeasuresList() {
return controlMeasuresList;
}
public void setControlMeasuresList(List<ControlMeasures> controlMeasuresList) {
this.controlMeasuresList = controlMeasuresList;
}
//下面其他get和set方法及构造方法
}
注意:除了与XML上一一对应外,还加了List<ControlMeasures>用于对应规则库。
规则库XML和实体:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.vrv.paw.domain">
<class name="ControlMeasures" table="vrv_paw_controlMeasures">
<cache usage="transactional" />
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="unGenRightRule" type="integer" />
<property name="genRightRule" type="integer" />
<property name="softName" type="string" length="255" />
<property name="softId" type="integer" />
<property name="gmId" type="integer" />
</class>
</hibernate-mapping>
public class ControlMeasures implements Serializable {
private static final long serialVersionUID = -5449557095173090598L;
//序号
private Integer id;
//非正版规则,取值0/1/3
private Integer unGenRightRule;
//正版规则,取值0/1/3
private Integer genRightRule;
//软件名
private String softName;
//软件id
private Integer softId;
//策略ID
private Integer gmId;
public Integer getGmId() {
return gmId;
}
public void setGmId(Integer gmId) {
this.gmId = gmId;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUnGenRightRule() {
return unGenRightRule;
}
public void setUnGenRightRule(Integer unGenRightRule) {
this.unGenRightRule = unGenRightRule;
}
public Integer getGenRightRule() {
return genRightRule;
}
public void setGenRightRule(Integer genRightRule) {
this.genRightRule = genRightRule;
}
public String getSoftName() {
return softName;
}
public void setSoftName(String softName) {
this.softName = softName;
}
public Integer getSoftId() {
return softId;
}
public void setSoftId(Integer softId) {
this.softId = softId;
}
public ControlMeasures(){
super();
}
public ControlMeasures(Integer id, Integer unGenRightRule, Integer genRightRule, String softName, Integer softId,Integer gmId) {
this.id = id;
this.unGenRightRule = unGenRightRule;
this.genRightRule = genRightRule;
this.softName = softName;
this.softId = softId;
this.gmId = gmId;
}
}
注意:规则库加了一个gmId用于对应那条策略。
二、然后再新建策略的时候,都要先保存策略,拿到策略id,再遍历该条策略下的规则库,设置策略id给规则库gmId,再保存规则库
//新建策略
public void createStrategy() {
this.msg = RESULT_SUCCESS;
try {
// 在添加之前查询一下该策略名称是否唯一
if (null != genuineManagementService.queryByName(genuineManagement.getPolicyName())) {
this.msg = "RepeatName";
} else {
genuineManagement.setIsPublish(false);
genuineManagementService.save(genuineManagement);//先保存策略,拿到策略id
for(ControlMeasures controlMeasures : genuineManagement.getControlMeasuresList()){
controlMeasures.setGmId(genuineManagement.getId());//设置策略id给规则库的gmId
controlMeasuresService.save(controlMeasures);
}
}
} catch (Exception e) {
this.msg = RESULT_ERROR;
e.printStackTrace();
} finally {
print(JsonUtil.build(new String[] { "msg","id","policyName"}, this.msg,genuineManagement.getId(),genuineManagement.getPolicyName()));
}
}
修改策略的时候,先更新策略,再通过策略id去规则库表删除该策略id对应的gmId的数据,然后再遍历该策略下规则库,再保存各条规则库
//修改策略
public void editStrategy() {
this.msg = RESULT_SUCCESS;
try {
genuineManagement.setIsPublish(false);
genuineManagementService.update(genuineManagement);//先更新策略
controlMeasuresService.deleteGmId(genuineManagement.getId());//再通过策略id去规则库表删除该策略id对应的gmId的数据,然后再遍历该策略下规则库,再保存各条规则库
for(ControlMeasures controlMeasures : genuineManagement.getControlMeasuresList()){
controlMeasures.setGmId(genuineManagement.getId());
controlMeasuresService.save(controlMeasures);
}
} catch (Exception e) {
this.msg = RESULT_ERROR;
e.printStackTrace();
} finally {
print(JsonUtil.build("msg", this.msg));
}
}
删除策略时,先删除规则库,再删除策略
//删除策略
public void deleteStrategy() {
this.msg = RESULT_SUCCESS;
boolean flag = true;
try {
if(selectedIds != null && !"".equals(selectedIds)){
String[] ids = selectedIds.split(",");
for(String id :ids){
GenuineManagement gm = genuineManagementService.queryById(Integer.parseInt(id));
if(gm != null && gm.getIsPublish()){
flag = false;
this.msg = RESULT_FAIL;
break;
}
}
if(flag){
Integer[] delIds = new Integer[ids.length];
for(int i=0;i<ids.length;i++){
delIds[i] = Integer.parseInt(String.valueOf(ids[i]));
controlMeasuresService.deleteGmId(delIds[i]);//先删除规则库
}
genuineManagementService.deleteByIds(delIds);//再删除策略
}
}
} catch (Exception e) {
this.msg = RESULT_ERROR;
e.printStackTrace();
} finally {
print(JsonUtil.build("msg", this.msg));
}
}
此外需要注意的是,策略实体里面有list,所以在用ajax传值的时候,那个list集合获取不到值,后来发现需要在前台传值的时候做下小操作,即模拟表单数据传值
stategy = {
'genuineManagement.policyName' : name,
'genuineManagement.flag' : isControl,
'genuineManagement.method' : controlMeasures,
'genuineManagement.controlMeasuresList[0].id' :1,
'genuineManagement.controlMeasuresList[0].name' :'asd',
'genuineManagement.controlMeasuresList[1].id' :1,
'genuineManagement.controlMeasuresList[1].name' :'asd'
};
//获取配置的策略项的值
function getStrategy() {
var stategy = {};
var name = $('#strategyName').val();
var isControl = $('input[name="isControl"]:checked').val();
var controlMeasures = $("input[name='controlMeasures']:checked").val();
var controlMeasuresList = $("#ruleManagementTable").datagrid("getRows");
var formObj = new Object();
formObj['genuineManagement.policyName']=name;
formObj['genuineManagement.flag']=isControl;
formObj['genuineManagement.method']=controlMeasures;
for(var i in controlMeasuresList){
formObj['genuineManagement.controlMeasuresList['+i+'].softName'] = controlMeasuresList[i].softName;
formObj['genuineManagement.controlMeasuresList['+i+'].genRightRule'] = controlMeasuresList[i].genRightRule;
formObj['genuineManagement.controlMeasuresList['+i+'].unGenRightRule'] = controlMeasuresList[i].unGenRightRule;
formObj['genuineManagement.controlMeasuresList['+i+'].softId'] = controlMeasuresList[i].softId;
}
return formObj;
}
最主要是我们要循环模拟list里面的这个数据。
//修改策略:侧边滑入中的修改按钮事件
$('#editStrategyBtn').click(function() {
var strategyID = $('#strategyID').val();
var dataObj = getStrategy();
if (dataObj['genuineManagement.policyName'].replace(/(^\s)|(\s$)/g, '').length == 0) {
showMsg("","策略名不能为空",false);
return false;
}
dataObj['genuineManagement.id'] = strategyID;//修改的时候记得要加上策略id
$.ajax({
type : "POST",
url : "${basePath}/genuineManagementAction_editStrategy.do",
data : dataObj,
dataType : "json",
success : function(data) {
if (data.msg === "success") {
$('#boxclose').click();
$('#inside_tableElement').datagrid('load');
showMsg("系统提示", "策略修改成功", false);
} else if (data.msg === "RepeatName") {
showMsg("","提示:策略名称重复",false);
} else {
showMsg("系统提示", "策略修改失败", false);
}
}
});
});
这样模拟数据,后台就可以获取到值了。