2013-05-09 57 views
0

我正在使用Cayenne將記錄添加到MySQL數據庫,並且我看到一些奇怪的行爲。Cayenne「重置」主鍵值?

當我運行我的應用程序時,我創建了一個DataContext,執行一系列添加,然後關閉應用程序。這很好,因爲我爲主鍵使用了一個整數,當我向數據庫添加記錄時,鍵會自動增加。由於某種原因,第一條記錄的起始位置爲200,第二條記錄的起始位置爲201,等等。

但是,如果我停止了應用程序,然後再次運行,則主鍵從200開始!這當然會導致拋出一個異常,因爲新記錄最終會有一個重複的主鍵。這看起來像在我啓動我的應用程序後使用DataContext的newObject()創建一個新對象時,Cayenne並沒有「記住」在以前運行應用程序時主鍵增加了多少。

有誰知道是什麼導致主鍵值的重置,以及(更重要的是)如何阻止它發生?或者我在當前版本的Cayenne中發現了一個錯誤?我正在使用版本3.0.2。

有人請指教...

回答

1

上次使用的PK給定的表存儲在名爲AUTO_PK_SUPPORT一個特殊的表。請檢查您的應用重新啓動之間的表格內容。同時檢查您的應用程序Cayenne的日誌讀取和寫入AUTO_PK_SUPPORT。這應該讓你知道發生了什麼。

除此之外,您可能會切換到自動遞增PK(請參閱「數據庫提供的主鍵」部分here)。 MySQL支持自動遞增的PK列,如果你有改變模式的選項,這個IMO是所有可用的最乾淨的PK生成策略。 (並且它不需要AUTO_PK_SUPPORT)。

+0

是的,我已經檢查了AUTO_PK_SUPPORT表,並且讀取了建模器生成的SQL。顯然,當你創建模式時,出於某種原因,Cayenne Modeler將「下一個」主鍵設置爲200(爲什麼我不知道!)。即使我將密鑰生成設置爲「從數據庫」(我從這裏閱讀其他條目中計算出來),似乎也這樣做了。我一直無法找到阻止Modeler執行此操作的方法。我可能不得不用手擰鑰匙支撐臺 - 我真的不想這麼做...... – 2013-05-10 10:01:37

+0

我其實很愚蠢。當您使用Modeler創建數據庫模式以確保「Create PK Support」複選框未被選中時,它會有所幫助。問題解決了。 – 2013-05-10 12:18:51

+0

很高興你知道了。順便說一句「200」的起始價值有點像卡宴早期的遺產,因爲我們認爲保留一小部分「保留」用於Cayenne以外的保留小組是一個好主意。這完全是任意的(可能是10或1000等)。它不應該影響任何東西。我想我們可以把它放到1以減少混淆。 – 2013-05-10 17:43:39