`

hibernate一对多保存完整实现

    博客分类:
  • ssh
阅读更多

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

分享到:
评论
1 楼 NineInchNails 2011-08-25  
有沒有項目的代碼啊 可不可以給我看看這個功能?

相关推荐

    Hibernate关联关系(一对多)

    Hibernate关联关系(一对多)代码的具体实现,包括保存班级;保存学生;保存班级的时候同时保存学生;已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系等一对多关系的情况。不足之处还望谅解

    Hibernate+中文文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    HibernateAPI中文版.chm

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    hibernate3.2中文文档(chm格式)

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    Hibernate中文详细学习文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    最全Hibernate 参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 ...

    Hibernate 中文 html 帮助文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索策略  16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多...

    Hibernate教程

    8.4.1. 一对多(one to many) / 多对一(many to one) 8.4.2. 一对一(one to one) 8.5. 使用连接表的双向关联(Bidirectional associations with join tables) 8.5.1. 一对多(one to many) /多对一( many ...

    Hibernate注释大全收藏

    这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....

    hibernate 体系结构与配置 参考文档(html)

    一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在...

    Hibernate实战(第2版 中文高清版)

     7.2.1 一对多关联   7.2.2 多对多关联   7.2.3 把列添加到联结表   7.2.4 映射map   7.3 多态关联   7.3.1 多态的多对一关联   7.3.2 多态集合   7.3.3 对联合的多态关联   7.3.4 每个具体类一张...

    Hibernate框架包

     持久化:将我们想要保存的数据保存到硬盘上,也就是我们电脑的磁盘上,为什么叫持久化呢,就是数据能够保存的很久,所以叫持久化,现在对持久化的实现过程大多通过各种关系型数据库完成,所以我们常说的,将数据...

    Hibernate注解

    * @OneToMany 设置一对多关联。cascade属性指定关联级别,参考@OneToOne中的说明。fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载 * 方法一 使用这种配置,在为“一端”添加“多...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) ...

    Hibernate_Annotation关联映射

    通过在被拥有的实体端(owned entity)增加一个外键列来实现一对多单向关联是很少见的,也是不推荐的,建议通过一个联接表来实现这种关联(下面会讲到)。 @JoinColoumn批注来描述这种单向关联关系 @Entity Public class...

    Hibernate4.3.5myFilter

    本代码包含了hibernate 的一对多的双向关联,实现级联保存,并整合了Hibernate的过滤器功能、c30的数据库连接池功能。

    Hibernate3+中文参考文档

    7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 ...

    hibernate3.04中文文档.chm

    8.5.1. 一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多(many to many) 9. 组件(Component)映射 9.1. 依赖对象(Dependent objects) 9.2. 在集合中出现的依赖...

Global site tag (gtag.js) - Google Analytics