2011-09-15 14 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(最左端)しか許さず、その分離を長さから指定できるORMを知らない全体の列 – DataNucleus

答えて

3

calculating a hash value for your text stringとお考えですか?次に、ハッシュ値を保存し、ハッシュ値の一意性をチェックするだけです。ハッシュ値を取得すると、実際のテキスト文字列をチェックします。それらが異なる場合、シーケンス値が含まれます。もしあなたがあなたのエラーを見つけなかったら。だからあなたのテーブルには、(同じハッシュ値内で一意)

ハッシュ、シーケンスであるTextString

とあなたのユニークなインデックスが一意性をテストするには

ハッシュ、シーケンス

であるハッシュ値を計算し、それをゼロシーケンスで保存しようとします。配列ゼロに格納できない場合は、シーケンス0のテキスト文字列を比較します。それらが同じ場合は、重複するテキストが見つかりました。それらが異なる場合、シーケンス1に格納しようとします。そのシーケンス番号で重複するテキスト文字列を見つけるまで、または次に使用可能なシーケンス番号でデータベースに格納するのに失敗しないまで、繰り返します。

トリックは、非常に多くの重複を与えず、長いテキスト文字列を処理できるハッシュアルゴリズムを計算しています。あなたのためにこれを行うことができる偉大なORMであればさらに良いでしょう。

+0

最終的に、私は私の質問への直接的な答えを見つけようとしている間にこの道を進みました。われわれが理解しているように、ORMの妖精粉末は私たちを助けようとするものではなく、私たちの問題の最終解決にもなりました。それを書いてくれてありがとう。 – skuro

関連する問題