hibernate的po实体层是支持方法重载的,hibernate4+struts2+spring4实现批量更新信息,前端json数据,后台数据库包括等复杂类型
json转实体对象
先说说使用场景吧,如图一个表格订单信息
此订单为模拟订单,只有一条订单信息,这里我的问题是时间问题,其它问题可类似解决
时间是一个长整形(或者就是日期格式,但终究是字符串形式),在前端通过如下代码变成了以上格式:
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中的更新或保存代码就是更新或保存这个实体对象数组,这里的业务逻辑我就不写了
主要说说,这里的时间怎么处理
实体类中的时间是一个日期类型的: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/天,具体规则查看活动详情