1

Word と State の 2 つのテーブルがあり、State には ID と CurrentState の 2 つの列が含まれています。3 つの静的行は 1-Active、2-InActive、3-Other Word が行を追加するテーブルです。ID、Value、Description、CurrentState の 4 つの列があります。currentState 列に State への外部キーがあります。これは、Word を作成し、currentState フィールドを設定して永続化する作業コードです。

Word word = new Word(); 
word.setValue("someWord");
word.setDescription("some description for this word");      
State state = new State(1,"Active");
word.setState(state);   
worddao.saveOrUpdate(word);

問題は、これが正しく見えないことです。有効な State 行を指す Word を作成できるように、State インスタンスを作成するためのベスト プラクティスは何ですか。ここで列挙はオプションですか?つまり、誤って ID = 5 の State を作成し、外部キー制約に違反する可能性があるということです。そうならないためにも、まずはこれを防ぎたいですよね。何か案は?

4

1 に答える 1

1

これを行う安全な方法は、新しいオブジェクトを作成するのではなく、状態オブジェクトを検索することです。エンティティをキャッシュ可能としてマークし、クエリをマークして状態をキャッシュ可能として取得し、不要なクエリを回避することもできます。

Word word = new Word(); 
word.setValue("someWord");
word.setDescription("some description for this word");      
State state = stateDao.findByState("Active")
word.setState(state);   
worddao.saveOrUpdate(word);

マスター/参照データテーブルのもう1つのオプション(私が一般的に従う)は、数値IDを持たないことです。その文字列表現である列を1つだけ持って、それを外部キー列として使用します。

これの利点は、データベース内のデータを表示しているときに、単語テーブルの状態を簡単に解釈できることです。データを理解するためにもう1回メンタルルックアップを行う必要はありません。

もう1つの利点は、キャッシュが簡単になることです。ルックアップは常に主キーによるため、クエリではなくエンティティをキャッシュする必要があります。

後で必要に応じて、表示ラベルである別の列を追加できます。

于 2012-09-10T09:28:26.600 に答える