前台部分
首先定义一个数组,用来储存STORE里的值。
之后利用store自带的each遍历方法把数组填满。
最后建一个ajax请求传送到后台即可。
var lstAddRecord=new Array();
store.each(function(record) {
lstAddRecord.push(record.data);
});
Ext.Ajax.request({
url: 'function/rivaldata/rivalDataAction.do?tag=add',
params: {strJson:Ext.encode(lstAddRecord)}
});
后台解析部分
主要是利用了JSON-Lib包,实现了关键功能。
String strJson=request.getParameter("strJson");
JSONArray js=JSONArray.fromObject(strJson);
JSONObject jo=null;
Iterator it=js.iterator();
while(it.hasNext()){
jo=(JSONObject)it.next();
//follow codes are get the value :)
String goodId=jo.getString("goodId");
Double goodsPrice=jo.getDouble("goodsPrice");
//ok, to do something use the vaules:)
System.out.println("the goodId is :"+goodId);
}
用Hibernate做持久层的时候,在保存一对多关系的数据的时候,把主表端的inverse设为true,在JAVA对象里把关联做成双向,一次保存主表,效率要高.
1,inverse设为true,通过保存主表的方式,JAVA对象做双向关联,通过跟踪Hibernate的SQL,发现一共有三次insert操作.
如果不将子表方关联到主表方(将子表JAVA对象加到主表的set里),子表里不会插入数据,只产生1条插入主表的SQL.
如果不将主表方关联到子表方(将主表JAVA对象赋值到子表对象的对应属性),共有三次insert操作,但是子表里外键为空.
需要设置主表的mapping文件:
<set name="detailtbs" inverse="true" lazy="true" table="DETAILTB" cascade="all-delete-orphan " fetch="select">
<key>
<column name="MID" precision="22" scale="0" />
</key>
<one-to-many class="com.test.Detailtb" />
</set>
MasttbHome masttbHome = new MasttbHome();
Masttb masttb = new Masttb();
masttb.setMid(new BigDecimal(1));
masttb.setMastinfo("mastinfo");
//如果不如下那样把主表对象关联到子表JAVA对象,子表的外键会为空
Detailtb detailtb1 = new Detailtb(new BigDecimal(1),masttb,"detailinfo1");
Detailtb detailtb2 = new Detailtb(new BigDecimal(2),masttb,"detailinfo2");
//如果不把子表的对象加入到主表的set里,不会插入子表数据.
masttb.getDetailtbs().add(detailtb1);
masttb.getDetailtbs().add(detailtb2);
masttbHome.persist(masttb);
2,如果将inverse设为false,JAVA代码里面可以只把子表方的对象加到主表对象的set里面,进行单向关联,保存主表,会产生3条SQL insert语句,2条update(update 子表)语句.
做双向关联的效果一样和单向一样.
如果不将子表方关联到主表方(将子表JAVA对象加到主表的set里),子表里不会插入数据,只产生1条插入主表的SQL.
如下例3:
<set name="detailtbs" inverse="false" lazy="true" table="DETAILTB" cascade="all-delete-orphan " fetch="select">
<key>
<column name="MID" precision="22" scale="0" />
</key>
<one-to-many class="com.test.Detailtb" />
</set>
MasttbHome masttbHome = new MasttbHome();
Masttb masttb = new Masttb();
masttb.setMid(new BigDecimal(1));
masttb.setMastinfo("mastinfo");
Detailtb detailtb1 = new Detailtb();
detailtb1.setDtid(new BigDecimal(1));
detailtb1.setDetailinfo("detailinfo1");
Detailtb detailtb2 = new Detailtb();
detailtb2.setDtid(new BigDecimal(2));
detailtb2.setDetailinfo("detailinfo2");
//只将子表关联加到主表对象,主表必须 inverse="false"
masttb.getDetailtbs().add(detailtb1);
masttb.getDetailtbs().add(detailtb2);
masttbHome.persist(masttb);
*如果主表 inverse="true",就必须把主表关联到子表方:
detailtb1.setMasttb(masttb);
detailtb2.setMasttb(masttb);
否则子表里的外键就没有被赋值.
3,下面的代码是通过保存子表的方式,inverse="false",只是在多方的JAVA对象里做了关联,通过跟踪Hibernate的SQL,发现有3条SQL insert语句,1条select(select主表)语句,2条update(update子表)语句.
如果是做了双向关联,,发现有3条SQL insert语句,1条select(select主表)语句,4条update(update子表)语句.
如果不将主表关联到子表对象,只会往子表插入数据,如果外键定义了不能为空限制,会有异常.
需要设置子表的mapping文件:
<many-to-one name="masttb" class="com.test.Masttb" cascade="save-update " fetch="join">
<column name="MID" precision="22" scale="0" />
</many-to-one>
Masttb masttb = new Masttb();
masttb.setMid(new BigDecimal(1));
masttb.setMastinfo("mastinfo");
Detailtb detailtb1 = new Detailtb(new BigDecimal(1),masttb,"detailinfo1");
Detailtb detailtb2 = new Detailtb(new BigDecimal(2),masttb,"detailinfo2");
//masttb.getDetailtbs().add(detailtb1);
//masttb.getDetailtbs().add(detailtb2);
DetailtbHome detailtbHome = new DetailtbHome();
detailtbHome.persist(detailtb1);
detailtbHome.persist(detailtb2);
*:在用来做保存的对象对应的mapping文件必须设cascade为关联保存,如,用主表关联保存,如例1,需要在set方加上cascade为级联保存.如果是在子表,需要在子表方加上cascade为级联保存,如例3.
inverse的作用:
inverse只能用在多方(set/map/list/array/bag),推荐做法是设为true,同时在JAVA代码里面对对象进行双向关联.如上面的例子那样.
4,如果将inverse设为true,JAVA代码里面只把one方的对象关联到多方里面,进行单向关联,保存子表,产生3条SQL insert语句,1条select(select主表)语句,2条update(子表)语句.
如果在JAVA对象做双向关联,SQL的效果和单向一样.
如果不将主表关联到子表对象,只会往子表插入数据,如果外键定义了不能为空限制,会有异常.
如下例5:
主表mapping:
<set name="detailtbs" inverse="true" lazy="true" table="DETAILTB" cascade="all-delete-orphan " fetch="select">
<key>
<column name="MID" precision="22" scale="0" />
</key>
<one-to-many class="com.test.Detailtb" />
</set>
子表mapping:
<many-to-one name="masttb" class="com.test.hb.Masttb" cascade="save-update" fetch="join">
<column name="MTID" precision="22" scale="0" />
</many-to-one>
JAVA代码:
tx = sessionFactory.getCurrentSession().beginTransaction();
Masttb masttb = new Masttb();
masttb.setMid(new BigDecimal(1));
masttb.setMastinfo("mastinfo");
//可以只做多方做单向关联:
Detailtb detailtb1 = new Detailtb(new BigDecimal(1),masttb,"detailinfo1");
Detailtb detailtb2 = new Detailtb(new BigDecimal(2),masttb,"detailinfo2");
//做双向关联不会影响SQL:
//masttb.getDetailtbs().add(detailtb1);
//masttb.getDetailtbs().add(detailtb2);
DetailtbHome detailtbHome = new DetailtbHome();
detailtbHome.persist(detailtb1);
detailtbHome.persist(detailtb2);
tx.commit();
总结:
1,最基本的原则:
如果保存主表的方式,必须将子表的对象加到主表对应的对象集合属性里.
如果保存子表的方式,必须将主表的对象赋值给子表对应的对象的属性里.
2,inverse=true的时候
如果保存主表的方式,必须做双向关联,否则,子表的外键就会为空值.
如果保存子表的方式,可以只将主表的对象赋值给子表对应的对象的属性里,但是会产生不必要的SQL操作.
3,inverse=false的时候
如果保存主表的方式,可以只将子表的对象加到主表对应的对象集合属性里.但是会产生不必要的SQL操作.
如果保存子表的方式,可以只将主表的对象赋值给子表对应的对象的属性里,但是会产生不必要的SQL操作.
inverse为true的意思是当hibernate探测到关联的持久化对象的关联状态发生变化的时候,按照多方的改变来更新数据库,从而避免不必要的SQl操作.
最佳做法是,保存主表,做双向关联,inverse设为true.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kkdelta/archive/2010/03/05/5349358.aspx
分享到:
相关推荐
"前台Ajax与后台Json传递"这个主题就是关注如何高效地实现这一交互过程。Ajax(Asynchronous JavaScript and XML)技术允许我们在不刷新整个页面的情况下,实现局部数据的更新,而Json(JavaScript Object Notation...
在最近的学习中遇到一个小问题,如何把JSON数组显示在前台的table中,经过一番借鉴和学习之后终于解决了这个问题。具体的代码如下: (前提:利用ajax获取过来的JSON字符串必须是规范的,这样才能解析正确。后台获取...
在介绍aspx后台传递Json到前台的两种接收方法之前,我们先了解一些基础知识点。Json(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,现在已经成为一种广泛...
最近上班太忙,晚上抽空整理一下ajax请求中,后台返回json字符串和json数组的场景,以及前台的处理示例。 直接看代码。 json字符串的后台响应 package com.ajax; import java.io.IOException; import java.io....
后台接收到的数据一直显示null 原因: 使用@RequestBody标签接收json数据,参数类型不能用Sting 看这两个注解的作用 @RequestParam 是作用在形参列表上,RequestParam可以接受简单类型的属性,也可以接受对象类型。...
1. 创建数据结构:这可以是数组、集合、字典等,根据需要存储的数据类型来创建。 2. 转换数据:使用JSON类的`Serialize`方法将ASP数据结构转换为JSON字符串。 3. 输出JSON:在ASP响应中设置`Response.ContentType`为...
Android客户端与服务器通信通常采用HTTP或HTTPS协议,通过发送HTTP请求(GET、POST等)获取或提交数据。常用的网络库有OkHttp、Volley、Retrofit等。 1. OkHttp:一个高效的HTTP客户端,支持同步和异步请求,内置了...
这行代码会在请求成功后初始化ZTree,`$("#treeDemo")`是ZTree的容器,`setting`是ZTree的配置项,`data`则是从后台获取的JSON数据。 4. **事件监听与数据更新**:ZTree提供了丰富的事件监听机制,如`onClick`、`...
业务是需要将前台jQuery easyUI DataGrid列表中所选的若干行的数据传到后台进行update操作 通常情况下我们会获取所选取行对象的ID,通过循环及简单封装拼凑成一个长String传送过去,并在Service层解释再通过...
使用SpringMVC框架,用JSON进行前台和后台之间的数据交互,主要包括,前台向后台传送JSON,JSON数组,后台传送JSON数据到前台,前台通过JQuery解析JSON数据,适合刚接触JSON的初学者
一、前台 // 转换成对象 var myObject = JSON.parse(_data); alert(对象:+myObject.msg); // 转换成数组 var myobj = eval([+_data+]); for (var i = 0; i < myobj.length; i++) { alert(...
在SpringMVC中,前台传递数组类型数据到后台,并用List类型接收是一种常见的需求。下面将详细介绍如何在SpringMVC中实现前台传数组类型,后台用List类型接收实例代码。 一、前台传递数组类型数据 在前台,我们可以...
// 从请求体中获取JSON数据 // 后续处理逻辑,如操作Excel文件 }); app.listen(3000, () => console.log('Server running on port 3000')); ``` 在这个例子中,`/save`路由会接收到前端发送的JSON数据,并在...
用ajax获取后台数据,返回json数据,怎么在前台使用呢? 后台 if (dataType == "SearchCustomer") { int ID; if (Int32.TryParse(CustomerID, out ID)) { string s = GridComputer.GridCustomer.getCustomer(1...
Java中前台往后台传递多个id参数的实例 在 Java 中,前台往后台传递多个 id 参数是非常常见的场景。今天我们就来分享一个实例,展示如何在 Java 中实现前台往后台传递多个 id 参数。 首先,我们需要在前台 JS 代码...
一般来说,可以选 择XML格式和Json格式的数据进行交互,但是XML格式的数据操作相对繁琐,因此,大部分开发会选择Json格式的数据进行交互,因此,我们的程序在后台需要把要返回前台的数据 拼接成Json格式的字符串,...
JSON数组则由方括号[]包围,元素之间用逗号分隔。 2. **Java处理JSON**:在提供的文件中,`json-lib-2.4.jar`是一个常用的Java库,它提供了处理JSON的能力。你可以使用`net.sf.json.JSONObject`和`...
1. Ajax与异步处理概念:异步处理指的是前台页面的JavaScript能够调用后台方法,而不需要刷新页面即可与服务器交互数据,这一技术改变了传统网页必须通过刷新才能提交数据、接收结果的交互方式。Ajax(Asynchronous ...
2. 后台到前台的数据传输 在Web开发中,后端服务处理业务逻辑后,常常会通过HTTP请求将数据以JSON格式传递给前端页面。前端的JavaScript代码需要通过Ajax(Asynchronous JavaScript and XML)技术实现异步请求,从而...