1

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

    @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. 这是正确的方法还是我完全错误地理解它?
4

2 回答 2

2

我会Enum为. key_ value_ 它肯定更容易出错,但如果你仔细构建它们,性能提升将是值得的。请参见下面的代码:CountrySkill

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;
    }
}

所以你永远不需要去数据库来获取它们,并且使用枚举你可以做各种各样的事情,枚举,轻松访问引用属性,统一和一致地访问你的应用程序中的引用数据,而不是把它们集中在一个地图中。

于 2012-12-01T15:32:44.767 回答
1

不,我会说这是一个正确的方法。你应该把国家放在他们自己的表里,把技能放在他们自己的表里。

首先,因为国家/地区不可避免地会出现额外的列,这对技能没有任何意义(反之亦然)。

其次,因为您希望从数据库中的其他表(以及对象模型中的其他实体)中引用国家或技能。因此,例如,您需要从地址到国家/地区的外键,并且您不希望地址引用技能而不是国家/地区。您需要从 Address 到 Country 的 ManyToOne 关联,而不是从 Address 到 ReferenceTable 的关联。

我感觉你正在预优化。这样的参考表很小,数据库会将所有内容都保存在内存中。所以查询它们,即使你经常这样做,也会非常快。

如果您想完全避免这些查询,那么您可以简单地使用 hibernate 的二级缓存,这将使一切变得透明(即您将像往常一样继续编程,并且 Hibernate 将进入其缓存而不是进入数据库) . 这将带来额外的优势,例如能够实际更新这些表中的信息,而不会获得太长时间的陈旧值(或根本不会获得陈旧值)。

于 2012-12-01T14:28:27.033 回答