Spring MVC - 在服务器启动时从数据库获取参考数据

时间:2012-12-01 14:09:46

标签: hibernate spring-mvc drop-down-menu

在阅读了很多帖子后,我打算使用以下方法从数据库中提取参考数据(代码尚未测试)。

    @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

我有两个问题,

  1. 这是一个静态参考数据(我不会改变几个月),所以我不想为每个请求命中数据库,而是应该在服务器启动时加载数据。怎么做?
  2. 这是正确的做法还是我理解它是完全错误的?

2 个答案:

答案 0 :(得分:2)

我会为Enum创建key valueCountry构造函数,为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会转到它的缓存而不是去数据库)。这将带来额外的好处,例如能够实际更新这些表中的信息而不会过时地过时(或者根本没有获得过时的值)。