一对多保存,一是入库单storage,多是物品列表goods,store中保存的是一个goods数组,storagestore中放的是所有goods的信息和storage信息提交到后台
1)、从列表中取出数据往store中添加数据
var gridWin = new Ext.grid.GridPanel( {
frame : true,
stripeRows : true,
region : "center",
store : storeGoods,
listeners:{"rowdblclick":function(grid,index,e){
var record = gridWin.store.getAt(index);
var mygoods=new TopicRecord({
'goodsname':record.get('goodsname'),
'goodsunit':record.get('goodsunit'),
'goodsstyle':record.get('goodsstyle')
});
addWin.hide();
store.insert(0, mygoods); //双击grid中的数据就可以往store中添加多条物品信息
}
},
enableColumnMove : false,
colModel : cmWin,
viewConfig : {forceFit : true},
sm : smWin,
bbar : new Ext.PagingToolbar({
pageSize : 15,
store : storeGoods,
displayInfo : true,
displayMsg : '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
emptyMsg : "没有记录"
})
});
2)、将store中的goods数组和入库单的数据放入到storagestore中,然后提交
var query = new Ext.Button( {
text : ' 保 存 ',
handler : function() {
//取出form中的storage数据然后插入到storagestore中
var mystorage=new TopicRecord({
'menucode':Ext.getCmp('menucode').getValue(),
'makedate':Ext.getCmp('makedate').getValue(),
'moneysum':Ext.getCmp('moneysum').getValue(),
'storename':Ext.getCmp('storename').getValue(),
'storekeep':Ext.getCmp('storekeep').getValue(),
'supplyfactory':Ext.getCmp('supplyfactory').getValue(),
'handleperson':Ext.getCmp('handleperson').getValue(),
'storagedate':Ext.getCmp('storagedate').getValue()
});
storeUpdate.insert(0, mystorage);
//取出grid列表中的所有goods信息,放入storage数组中
var view = grid.getView();
for (var i = 0; i < view.getRows().length; ++i) {
var record = grid.store.getAt(i);
var mygoodsdetail=new TopicRecord({
'goodsname':record.get('goodsname'),
'goodsunit':record.get('goodsunit'),
'goodsstyle':record.get('goodsstyle'),
'goodsnumber':record.get('goodsnumber'),
'unitprice':record.get('unitprice'),
'amount':record.get('amount'),
'productdate':record.get('productdate'),
'brand':record.get('brand')
});
storeUpdate.insert(0, mygoodsdetail);
}
var modified = storeUpdate.modified;
updateData(modified);
}
});
提交storage数组的数据,提交的是一个数组
function updateData(modified) {
var json = [];
Ext.each(modified, function(item) {
json.push(item.data);
});
if (json.length > 0) {
Ext.Ajax.request({
url: "../../ast/consumables/saveStorage.action",//调用一对多的保存action,提交到后台
params: { goods: Ext.util.JSON.encode(json) },//将数组转变为Jason对象数组,数组名为goods
method: "POST",
success: function(response) {
Ext.Msg.alert("信息", "数据更新成功!", function() { store.reload(); });
},
failure: function(response) {
Ext.Msg.alert("警告", "数据更新失败,请稍后再试!");
}
});
}
else {
Ext.Msg.alert("警告", "没有任何需要更新的数据!");
}
}
3)后台解析传入的Jason数组,然后给对象设置相应的一对多关系再保存
private ConStorageService conStorageService;
private ConStorage conStorage;
private Set<ConGoods> conGoodsall = new HashSet<ConGoods>();
public String saveStorage(){
try {
//后台读取前台传来的goods数组
String goods = request.getParameter("goods");
JSONArray js=JSONArray.fromObject(goods);
JSONObject jo=null;
//生成一个storage的入库单对象,然后往storage对象中设置值
ConStorage conStorage = new ConStorage();
for(int i=0;i<js.size();i++){
jo=(JSONObject)js.get(i);//依次读取Jason数组中的每一条数据
if(i==0){ //因为第一条插入的是storage的数据
conStorage.setMenucode(jo.getString("menucode"));
conStorage.setMakedate(jo.getString("makedate"));
conStorage.setMoneysum(jo.getString("moneysum"));
conStorage.setStorekeep(jo.getString("storekeep"));
conStorage.setStorename(jo.getString("storename"));
conStorage.setSupplyfactory(jo.getString("supplyfactory"));
conStorage.setHandleperson(jo.getString("handleperson"));
conStorage.setStoragedate(jo.getString("storagedate"));
}else{
ConGoods conGoods = new ConGoods();//生成一个新的goods对象然后给其赋值
conGoods.setGoodsname(jo.getString("goodsname"));
conGoods.setUnit(jo.getString("goodsunit"));
conGoods.setGoodsstyle(jo.getString("goodsstyle"));
conGoods.setGoodsnumber(jo.getString("goodsnumber"));
conGoods.setUnitprice(jo.getString("unitprice"));
conGoods.setAmount(jo.getString("amount"));
conGoods.setProductdate(jo.getString("productdate"));
conGoods.setBrand(jo.getString("brand"));
conGoods.setConStorage(conStorage);//设置goods对象与主单storage的一对多关系
conGoodsall.add(conGoods);//把goods对象加入ConGoods的set数组中
}
}
conStorage.setConGoods(conGoodsall);//往主单中设置多的goods对象的set数组
conStorageService.save(conStorage);//保存主单信息,同时保存了goods信息及一对多的关系
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return INPUT;
}
}
4)、一对多关系的hibernate配置:一的一方storage,多的一方goods
storage.hbm.xml
<hibernate-mapping package="com.kingee.ast.consumables.pojo">
<class
name="ConStorage"
table="ast_consumables_storage"
dynamic-update="true"
>
<meta attribute="sync-DAO">true</meta>
<id
name="Id"
type="string"
column="id"
>
<generator class="uuid.hex"/>
</id>
<property
name="storagedate"
column="storagedate"
type="string"
length="100"
/>
//上面一段就跟一般的hibernate配置一样把storage的所有属性写好
<set name="conGoods" cascade="save-update" inverse="true" lazy="true">
<key column="inid" />
<one-to-many class="com.kingee.ast.consumables.pojo.ConGoods"/>
</set>
</class>
//设置一对多的关系,以为storage对象中没有inid的属性所以用<set></set>然后设置<one-to-many >的关系
goods.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.kingee.ast.consumables.pojo">
<class
name="ConGoods"
table="ast_consumables_goods"
dynamic-update="true"
>
<meta attribute="sync-DAO">true</meta>
<id
name="Id"
type="string"
column="id"
>
<generator class="uuid.hex"/>
//<generator class="uuid.hex"/>的作用就是自动生成ID序列使生成的id不重复
</id>
<property
name="goodsstyle"
column="goodsstyle"
type="string"
length="100"
/>
//inid是一对多关系的外键属性对应storage中的id,因为在查询goods时要用到inid属性所以重写一个insert和update都为FALSE的property
<property
name="inid"
column="inid"
type="string"
length="100"
insert="false"
update="false">
</property>
//配置一对多的关系,inid对应一中的id,因为inid是goods中的属性,所以没有<set>直接用 <many-to-one >
<many-to-one name="conStorage"
column="inid"
class="com.kingee.ast.consumables.pojo.ConStorage"
lazy="false"
cascade="save-update"
not-null="false"
></many-to-one>
</class>
</hibernate-mapping>
5)、实体类的实现代码storage.java和goods.java
storage.java
public class ConStorage extends MunalBean{
private String menucode;
private String makedate;
private String moneysum;
private String storename;
private String storekeep;
private String supplyfactory;
private String handleperson;
private String storagedate;
private Set<ConGoods> conGoods ;//设置一对多的映射关系,在一中要设置一个多的数组
}
goods.java
public class ConGoods extends MunalBean{
private String inid;
private String outid;
private String originplace;
private String remarks;
private String goodsstyle;
private String goodscompanyid;
private ConStorage conStorage;//设置一对多的关系,多中ConGoods.setConStorage();
}
迭代器的使用
String goods = request.getParameter("goods");
JSONArray js=JSONArray.fromObject(goods);
Iterator it=js.iterator();
it.hasNext//用来判断是否还有对象数据,返回Boolean
it.next()//用来取到下一个对象数据
jo=(JSONObject)it.next();
先记录一下....
public String saveStorage(){
try {
ConStorage conStorage = new ConStorage();
String goods = request.getParameter("goods");
JSONArray js=JSONArray.fromObject(goods);
JSONObject jo=null;
Iterator it=js.iterator();
while(it.hasNext()){
ConGoods conGoods = new ConGoods();
jo=(JSONObject)it.next();
String goodId=jo.getString("goodsname");
String goodIddd=jo.getString("goodsname");
System.out.println(goodIddd);
conStorage.setStorekeep(goodIddd);
System.out.println(goodId);
conGoods.setGoodsname(goodId);
conGoods.setConStorage(conStorage);
conGoodsall.add(conGoods);
}
System.out.println(conGoodsall.size());
conStorage.setConGoods(conGoodsall);
conStorageService.save(conStorage);
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return INPUT;
}
}