在阅读了很多帖子后,我打算使用以下方法从数据库中提取参考数据(代码尚未测试)。
@Override
protected Map referenceData(HttpServletRequest request) throws Exception {
//Data referencing for country list box
Map referenceData = new HashMap();
referenceData.put("countryList", articleService.getCountryList());
//Data referencing for skills list box
Map<String,String> javaSkill = new LinkedHashMap<String,String>();
referenceData.put("skillsList", articleService.getSkillsList());
return referenceData;
}
参考数据表如下
id key value type
-----------------------------------------
1 1 United States countries
2 2 India countries
3 3 United Kingdom countries
4 4 China countries
5 1 Java skills
6 2 Spring skills
7 3 Hibernate skills
8 4 SQL skills
我有两个问题,
答案 0 :(得分:2)
我会为Enum
创建key
value
和Country
构造函数,为Skill
创建另一个构建函数。它肯定更容易出错,但如果你仔细构建它们,性能的提升将是值得的。请参阅以下代码:
public enum Country {
UNITED_STATES(1, "United States"), INDIA(2, "India"), UNITED_KINGDOM(1, "United Kingdom"), CHINA(4, "China");
private int key;
private String value;
Country (int key, String value) {
this.key = key;
this.value = value;
}
public int getKey() {
return key;
}
public String getValue() {
return value;
}
}
所以你永远不需要去数据库来获取它们,并且使用枚举你可以做各种事情,枚举,轻松访问参考属性,统一和一致地访问你的应用程序中的参考数据,而不是将它们集中在一个地图。
答案 1 :(得分:1)
不,我会说这是一种正确的方法。你应该将国家放在他们自己的表中,并将技能放在他们自己的表中。
首先,因为对于技能没有任何意义的国家/地区将不可避免地出现额外的列(反之亦然)。
第二,因为您希望从数据库中的其他表(以及对象模型中的其他实体)引用国家/地区或技能。例如,您希望从地址到国家/地区使用外键,并且您不希望地址引用技能而不是国家/地区。而且你需要一个从地址到国家的ManyToOne关联,而不是从Address到ReferenceTable。
我觉得你已经预先优化了。这样的引用表很小,数据库将把所有内容保存在内存中。因此,即使你经常这样做,查询它们也会非常快。
如果你想完全避免这些查询,那么你可以简单地使用hibernate的二级缓存,这将使一切都透明(即你将像往常一样继续编程,而Hibernate会转到它的缓存而不是去数据库)。这将带来额外的好处,例如能够实际更新这些表中的信息而不会过时地过时(或者根本没有获得过时的值)。