hibernate一对多保存完整实现

一对多保存,一是入库单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;
  }
     }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值