2012-09-10 58 views
1

我有2個表,Word和狀態, 狀態包含2個列,ID和CurrentState,它的3個靜態行是1--活動,2- InActive,3-其他 Word是表我正在添加行。它有4個列,ID,Value,Description和CurrentState。 它有一個外鍵在列currentState 這是我創建一個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實例的最佳做法是什麼,以便我可以創建指向有效State行的Word。 Enumeration是一個選項嗎?我的意思是我可以意外地創建一個ID = 5的國家並且違反了外鍵約束。我想首先防止這種情況發生。有任何想法嗎?

+1

是枚舉是一個選項!看到這個http://stackoverflow.com/questions/417062/enumerations-in-hibernate – bpgergo

+0

枚舉是很好的選擇 - 但它是更加努力添加新的值。如果已經有不同的值的條件代碼,這不是一個問題。 – gkamal

回答

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

主/參考數據表的另一個選項(我通常遵循)是沒有數字ID。只需要一列是它的字符串表示並將其用作外鍵列。

這樣做的好處是,當您查看數據庫中的數據時 - 表格中的狀態將很容易解釋。您不必再進行一次心理查找來了解數據。

另一個優點是緩存變得更容易。我們只需要緩存實體而不是查詢,因爲查找總是通過主鍵。

如果需要,稍後可以添加另一列,這是一個顯示標籤。

+0

乾杯,這就是我所得到的,我擔心如果我每次查詢數據庫以獲取有效的狀態值列表,這將導致不必要的查詢。緩衝桌子聽起來像我需要的,歡呼聲 – MayoMan