日期:2014-05-16 浏览次数:20403 次
?
public class OrderModel {
private List<String> favorableDescList;
}
?
订单中会存储一些优惠信息,方便页面展示时使用,如:
1、满100减50
2、参与【老会员真情回馈——精品课程体验活动】,仅需支付200.00学币
3、【Oracle + PL/SQL?实战】套装课程的【抢购】活动,优惠120.00学币
……等等
?
如图所示,我们在页面给用户展示他们参与的优惠信息:

如上优惠信息有如下特点:
1、只用于展示,不会涉及修改;
2、一旦订单支付成功,不会再改变;
3、数据量不会很大。
1、最简单的解决方案是关联表:

?但这种解决方案需要连表进行查询,感觉是没有必要的,毕竟只是展示数据,用关联表有点杀鸡用牛刀的感觉。
?
?
2、JSON解决方案:

?
通过如上思路我们可以解决许多类似的问题。
?
?
3、代码示例:
?
1、模型类:
public class OrderModel {
@Type(type = "cn.javass.framework.hibernate.type.JsonType") //①
private List<String> favorableDescList;
}
?①处使用我们自定义的Hibernate类型来进行转换,上边代码只有一部分
?
2、自定义JsonType
package cn.javass.framework.hibernate.type;
//省略import
public class JsonType implements UserType, Serializable {
private String json;
@Override
public int[] sqlTypes() {
return new int[] {Hibernate.STRING.sqlType()};
}
@Override
public Class returnedClass() {
return JsonList.class;
}
@Override
public boolean equals(Object o, Object o1) throws HibernateException {
if (o == o1) {
return true;
}
if (o == null || o == null) {
return false;
}
return o.equals(o1);
}
@Override
public int hashCode(Object o) throws HibernateException {
return o.hashCode();
}
/**
* 从JDBC ResultSet读取数据,将其转换为自定义类型后返回
* (此方法要求对克能出现null值进行处理)
* names中包含了当前自定义类型的映射字段名称
* @param resultSet
* @param names
* @param owner
* @return
* @throws HibernateException
* @throws SQLException
*/
@Override
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException {
String json = resultSet.getString(names[0]);
if(json == null || json.trim().length() == 0) {
return new JsonList();
}
return JSONArray.toList(JSONArray.fromObject(json), JsonList.class);
}
/**
* 本方法将在Hibernate进行数据保存时被调用
* 我们可以通过PreparedStateme将自定义数据写入到对应的数据库表字段
* @param p