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

2つ質問がありますが、

  1. これは静的な参照データです (私は何ヶ月も変更しません)。そのため、リクエストごとにデータベースにアクセスしたくなく、代わりにサーバーの起動時にデータをロードする必要があります。これを行う方法?
  2. これは正しいアプローチですか、それとも私はそれを理解する上で完全に間違っていますか?
4

2 に答える 2

2

Enumwithkeyvalueコンストラクターを作成し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;
    }
}

したがって、それらを取得するためにデータベースにアクセスする必要はありません。列挙を使用すると、列挙、参照プロパティへの簡単なアクセス、アプリ全体の参照データへの均一で一貫したアクセスなど、あらゆる種類のことを行うことができます。

于 2012-12-01T15:32:44.767 に答える
1

いいえ、それは正しいアプローチだと思います。国を独自のテーブルに、スキルを独自のテーブルに配置する必要があります。

1 つ目は、追加の列が必然的に国に表示されるためです。これは、スキルには意味がありません (またはその逆)。

次に、データベース内の他のテーブル (およびオブジェクト モデル内の他のエンティティ) から国またはスキルを参照する必要があるためです。したがって、たとえば、アドレスから国への外部キーが必要になり、アドレスが国ではなくスキルを参照することは望ましくありません。そして、Address から ReferenceTable へではなく、Address から Country への ManyToOne 関連付けが必要になります。

事前に最適化しているような気がします。このような参照テーブルは小さく、データベースはすべてをメモリに保持します。そのため、頻繁にクエリを実行しても、非常に高速です。

これらのクエリを完全に回避したい場合は、単純に hibernate の 2 次キャッシュを使用できます。これにより、すべてが透過的になります (つまり、通常どおりプログラミングを続け、Hibernate はデータベースではなくそのキャッシュに移動します)。 . これにより、古い値を長時間取得することなく (または古い値をまったく取得することなく)、これらのテーブルの情報を実際に更新できるなど、追加の利点がもたらされます。

于 2012-12-01T14:28:27.033 に答える