配置类对象数量不多,标识固定(通过标识可以获得唯一对象),但是种类较多,每种类都有自己独特的属性,如果每种类都使用一个表来存储,那么会产生大量的表,可以考虑将对象直接存储的方式来使用单独的表存储所有的配置类对象。
配置类对象的获取只有通过标识获取一种方式,所以对象存储表只需要两个核心字段,1)标识2)对象本身,对象可以通过序列化或者josn方式存储。对象存储作为内部机制,不对外暴露,外部使用时只需要知道对象本身即可
public class ObjectStore extends AbstractEntity{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;//对象的标识。可以是复合key,比如 积分规则中 key为角色+日常教学(目前没有角色,以后可能会扩展到角色)
private String object;//对象在数据库中以字符串方式存储
private Integer projectId;
private Integer creatorId;
private Date createDate;
private Integer modifierId;
private Date modifyDate;
一个具体的配置对象
public class HomeworkScoreCFG {
private int submitOne; //每份合格作业,获得多少积分
private List<KeyValue> recommLevels;//每级推荐获得多少积分,有多少推荐级别,key使用推荐级别,value是分数
private boolean enabled = false;
/**
* 返回key名
* @return
*/
public static String keyName() {
return "HomeworkScoreCFG";
}
//如果需要根据角色配置不同,那么keyName增加roleId参数即可
public static String keyName(Integer roleId) {
return "HomeworkScoreCFG"+roleId;
}
通过下面两个方法获取和保存
@Autowired
private ObjectStoreService objectStoreService;
public HomeworkScoreCFG getHomeworkScoreCFG(){
return objectStoreService.selectByKey(HomeworkScoreCFG.class,HomeworkScoreCFG.keyName());
}
public void saveOrUpdateHomeworkScoreCFG(HomeworkScoreCFG homework){
objectStoreService.saveOrUpdate(homework, HomeworkScoreCFG.keyName());
}
@Service
public class ObjectStoreService {
@Autowired
private ObjectStoreMapper objectStoreMapper;
/**
* 根据传入的key,及对应的Class返回实体,如果查询到的结果为null,返回一空构造的对象
* @param clazz
* @param key
* @return
*/
public <T> T selectByKey(Class<T> clazz,String key){
Integer projectId = ProjectContextUtils.getProjectContext().getProjectId();
ObjectStore objectStore = objectStoreMapper.selectByKey(key,projectId);
if(objectStore == null){
try {
return clazz.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
return JsonUtils.toBean(objectStore.getObject(),clazz);
}
/**
* 新增或修改
* @param t
* @param name
*/
public <T> void saveOrUpdate(T t,String name){
ObjectStore os = objectStoreMapper.selectByKey(name, ProjectContextUtils.getProjectContext().getProjectId());
if(os == null){//新增
ObjectStore os1 = new ObjectStore();
os1.setName(name);
os1.setObject(JsonUtils.toJson(t));
objectStoreMapper.insert(os1);
}else{//修改
os.setName(name);
os.setObject(JsonUtils.toJson(t));
objectStoreMapper.updateByName(os);
}
}
}