`

json数组数据从前台往后台提交

    博客分类:
  • ssh
阅读更多

前台部分

 

首先定义一个数组,用来储存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

分享到:
评论

相关推荐

    js实现将json数组显示前台table中

    在最近的学习中遇到一个小问题,如何把JSON数组显示在前台的table中,经过一番借鉴和学习之后终于解决了这个问题。具体的代码如下: (前提:利用ajax获取过来的JSON字符串必须是规范的,这样才能解析正确。后台获取...

    ajax响应json字符串和json数组的实例(详解)

    最近上班太忙,晚上抽空整理一下ajax请求中,后台返回json字符串和json数组的场景,以及前台的处理示例。 直接看代码。 json字符串的后台响应 package com.ajax; import java.io.IOException; import java.io....

    asp输出json实例,json.asp

    用asp输出json格式,生成json对象。 json.asp格式化json类。ajax返回json格式数据

    jquery ajax 向后台传递数组参数示例

    需求: 在JS中向后台传递数组参数 分析: JS中的数组是弱类型的可以放任何类型(对象、基本类型),但是如果数组中放的是对象类型,传递到后台是显示的只能是对象字符串–[object Object],原因如下: 在后台接收的...

    SPringMVC框架下使用JSON

    使用SpringMVC框架,用JSON进行前台和后台之间的数据交互,主要包括,前台向后台传送JSON,JSON数组,后台传送JSON数据到前台,前台通过JQuery解析JSON数据,适合刚接触JSON的初学者

    js 转json格式的字符串为对象或数组(前后台)的方法

    一、前台 // 转换成对象 var myObject = JSON.parse(_data); alert&#40;对象:+myObject.msg&#41;; // 转换成数组 var myobj = eval&#40;[+_data+]&#41;; for (var i = 0; i &lt; myobj.length; i++) { alert&#40;...

    java验证字符串是否符合json格式

    json数据交互时作为校验是否通过,用于后台需要构建json返回前台必备

    ajax与json 获取数据并在前台使用简单实例

    用ajax获取后台数据,返回json数据,怎么在前台使用呢? 后台 if (dataType == "SearchCustomer") { int ID; if (Int32.TryParse(CustomerID, out ID)) { string s = GridComputer.GridCustomer.getCustomer(1...

    以JSON形式将JS中Array对象数组传至后台的方法

    业务是需要将前台jQuery easyUI DataGrid列表中所选的若干行的数据传到后台进行update操作   通常情况下我们会获取所选取行对象的ID,通过循环及简单封装拼凑成一个长String传送过去,并在Service层解释再通过...

    AnyFo - Util - Json4Ext:通用ExtJS数据交换处理

    一般来说,可以选 择XML格式和Json格式的数据进行交互,但是XML格式的数据操作相对繁琐,因此,大部分开发会选择Json格式的数据进行交互,因此,我们的程序在后台需要把要返回前台的数据 拼接成Json格式的字符串,...

    springMVC poi解析ajax上传excel文件,返回json对象\list数组

    此项目是基于springMVC实现的,基本流程为从前台jsp页面使用Ajax文件上传导入excel文件(.xls(97-03)/.xlsx(07以后)),传到后台controller调用相应工具类解析后返回指定参数做后续处理. 1. POIUtil.java工具类 解析...

    javaScript如何处理从java后台返回的list

    事情: 从java后台返回List类型数据,用于界面显示。但js中想获取它并操作它。直接使用EL表达式,js把它识别成字符串了。不是我想要的啊。。网上搜了搜大家的解决方案…最好的当然是把List集合转成json格式传到界面...

    JS动态遍历json中所有键值对的方法(不知道属性名的情况)

    如果后台返回给前台的json中key的值是动态生成的,那么我们没有办法使用常规的object.name或object[“name”]的方式来获取json中的值。 这个时候我们需要在不知道属性名称的时候,遍历json对象,可以使用如下方式: ...

    java将list转为树形结构的方法(后台和前台)

    前台: function listToTree(myId,pId,list){ function exists(list, parentId){ for(var i=0; i&lt;list.length; i++){ if (list[i][myId] == parentId) return true; } return false;

    js创建jsonArray传输至后台及后台全面解析

    jsonArray是数组,以[ ]包含数据,jsonObject是对象,以{ }包含数据。 介绍一个在前台组建一个jsonArray的容易方法 var array=[]; for(int i=0;i&lt;10;i++){ var item={}; item.a="a"+i; item.b="b"+i; ...

    Asp.net下使用Jquery Ajax传送和接收DataTable的代码

    当然也可以请求回XML,但是XML数据冗余多,取到客户端处理比json麻烦的多。 能不能简单一点呢? 上面这些问题,如果DataTable与JSON类型可以方便的相互转换,都可以迎刃而解了。 优点:1)避免不必要的回传; 2)...

    PHPCMS V9.6.6 修改版

    67. 新增统一返回json格式并退出程序dr_json函数 68. 新增将数组转换为字符串dr_array2string函数 69. 新增将字符串转换为数组dr_string2array函数 70. 新增根据文件扩展名获取文件预览信息dr_file_preview_html函数...

Global site tag (gtag.js) - Google Analytics