2011-09-15 61 views
2

我們需要將一個長的UTF-8字符串存儲到MySQL數據庫中,該數據庫必須進行唯一性檢查。這是當前的配置:使用MySQL InnoDB的JPA中對TEXT列的唯一限制

@Column(unique = true,length = 8000,columnDefinition="TEXT") 
private String text; 

但因爲MySQL需要一個索引前綴都BLOBTEXT字段中指定,這種失敗,出現以下錯誤:

BLOB/TEXT column 'path' used in key specification without a key length 

我怎樣才能正確地配置我的ORM映射來支持這種用例?

+1

MySQL不能索引長於特定長度IIRC的TEXT字段,並且只允許最多1000個(最左側)成爲索引的一部分,並且不知道任何允許從長度爲整列 – DataNucleus

回答

3

你考慮過calculating a hash value for your text string嗎?然後,您可以存儲散列值並只檢查散列值的唯一性。任何與散列值相沖突然後檢查實際文本字符串。如果它們不同,則包含一個序列值。如果沒有,你發現你的錯誤。所以,你的表是

哈希,序列(相同的散列值中是唯一的),TextString

和你的唯一索引是

哈希,序列

要測試的唯一性計算哈希值,試圖用零序列來存儲它。如果不能將它存儲在序列零處,則比較序列零處的文本字符串。如果它們相同,則會找到重複的文本。如果他們嘗試按順序1進行存儲,請重複此操作直到您在該順序號中找到重複的文本字符串,或者您沒有將其存儲在具有下一個可用順序號的數據庫中時失敗。

訣竅是找出一個散列算法,它不會給你很多重複項,並且可以處理長文本字符串。更好的辦法將是一個偉大的ORM,可以爲你做到這一點。

+0

最終,我們走上了這條道路,試圖找到更直接的答案來解決我的問題。正如我們所理解的那樣,沒有任何ORM童話粉末可以幫助我們,它也成爲我們問題的最終解決方案。感謝您將它寫入文字。 – skuro