hibernate的po实体层是支持方法重载的,hibernate4+struts2+spring4实现批量更新信息,前端json转po实体对象

hibernate的po实体层是支持方法重载的,hibernate4+struts2+spring4实现批量更新信息,前端json数据,后台数据库包括等复杂类型

json转实体对象

先说说使用场景吧,如图一个表格订单信息


111


此订单为模拟订单,只有一条订单信息,这里我的问题是时间问题,其它问题可类似解决


时间是一个长整形(或者就是日期格式,但终究是字符串形式),在前端通过如下代码变成了以上格式:


var d=new Date(value);
var year=d.getYear()+1900;
var month=d.getMonth()+1;
var date = d.getDate();
var hour=d.getHours();
var minute=d.getMinutes();
var second=d.getSeconds();
return   year+"-"+month+"-"+date+"   "+hour+":"+minute+":"+second;
但是修改参数时,传递到后台也是一个长整形,即使不是长整形,但是其表现形式仍然是字符串(上面已经提到),但是我们的po层需要的一个Date数据类型


这里我说说我的解决方法:
第一步:获取更新的订单信息,将其封装成json数组

//提交修改订单
function getSelected(){
    var rows = manager.getUpdated();
    if(rows.length == 0){
        alert("没有需要修改的订单")
    }
    $.ajax({
        url:"acorder!update.action",
        async:true,
        type:"post",
        dataType:"html",
       	data:{"shoporder":JSON.stringify(rows)},
       	success:function(data){
       		alert("更新成功");
       	},
       	error:function(){
       		alert("更新失败");
       	}
});

第二步:action中接受这个参数,在属性编辑器中进行编辑操作,属性编辑器中用到了fastjson进行处理
将这个json数组转换成了实体对象数组,相关代码如下:

Action中的代码,神略字段的get和set方法:


public class Orderinfo extends ActionSupport{
	public Shoporder[] shoporder;
属性编辑器(action的属性编辑器大家应该知道吧):


shoporder=emb.view.struts.converter.StringShoporderArrays

编辑器代码(属性编辑器的具体代码):


package emb.view.struts.converter;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;

import emb.model.hibernate.po.Shoporder;
import emb.model.hibernate.po.goodsfl;

public class StringShoporderArrays extends StrutsTypeConverter{

	@Override
	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
		//获得前端传递过来的字符串
		String getString = arg1[0];
		//获得一个JSONArray数组
		JSONArray array = JSONArray.parseArray(getString);
		Shoporder[] shoporder = JSON.parseObject(getString,new TypeReference<Shoporder[]>(){});
		return shoporder;
	}

	@Override
	public String convertToString(Map arg0, Object arg1) {
		//这里获得一个json数组,可以通过json数组来获得一个字符串,此处通过action的默认方式以获得,这里就不在获取
		/*
		 *也可以进行字符串拼接 
		 */
		return "不在获得";
	}

}

注意以上代码中的这句  Shoporder[] shoporder = JSON.parseObject(getString,new TypeReference<Shoporder[]>(){});

表示将这个json字符串对象转换为Shoporder对象,由于这个json字符串对象里有很多个数组,每一个数组就是一个Shoporder对象,所以这里返回的是一个数组


第三步:action中的更新或保存代码就是更新或保存这个实体对象数组,这里的业务逻辑我就不写了

主要说说,这里的时间怎么处理


我们的json数组里的时间是一个字符串(长整形或格式化后的时间,它们都是字符串)
实体类中的时间是一个日期类型的:Date
如本例中实体类中日期类代码如下:
private Date orderdate;	 //订单时间
//订单创建时间
@Column(name="lorderdate",unique=false,nullable=true) 
public Date getOrderdate() {
return orderdate;
}
public void setOrderdate(Date orderdate) {
this.orderdate = orderdate;
}


就是说,我们从json数组中获取到的时间是一个字符串,很明显这里是不符合要求的
如果我们将实体类中的设置时间改成这样:
public void setOrderdate(String orderdate){
这里代码将字符串转换为日期格式
this.orderdae=XXX
}

那么我们在获取订单信息时就会报错,数据不匹配的错误,因为获取时,他会设置这个日期,以供调用,但是我们的方法是接受一个字符串,而数据库中却是一个日期格式,所以报错。

所以这里我们可以这样修改这个orderdate的get和set方法,完整的代码如下:
//订单创建时间
@Column(name="lorderdate",unique=false,nullable=true) 
public Date getOrderdate() {
return orderdate;
}
public void setOrderdate(String orderdate) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String d = format.format(new Long(orderdate));
System.out.println(d);
try {
this.orderdate = format.parse(d);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void setOrderdate(Date orderdate) {
this.orderdate = orderdate;
}


对,就是这样,方法的重载,如果是从数据库中获得数据,他就会调用参数是Date的方法
如果是更新数据,或者保存数据,他就会调用参数是字符串的方法
因此,总结下:在我们的po实体层,可以根据我们的需要,进行方法的重载,来满足我们的需求。
而且根据测试,hibernate的实体层是支持方法的重载的。



爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img