8

私はこのコードを休止状態で使用しています。

@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="RightID", unique=true, nullable=false)

問題は、行を削除すると「RightId」が順番に残っていないことです。hibernatesはidをチェックする必要があり、id値が欠落している場合は、その値を'RightsId'に指定する必要があります。それ以外の場合は、通常どおり続行します。

4

3 に答える 3

10

Hibernateで利用できるそのようなオプティオはないと思います。AUTOの代わりに、次の戦略オプションを試すこともできます。

  1. GenerationType.TABLE-永続性プロバイダーは、データベーステーブルを使用してキーを管理します。

  2. GenerationType.SEQUENCE-永続性プロバイダーは、キー生成にデータベースシーケンスを使用します。データベースはシーケンスをサポートする必要があります

  3. GenerationType.IDENTITY-永続性プロバイダーは、キー生成のためにデータベースを延期します。データベースはIDENTITY列タイプをサポートしている必要があります。

別のポイント:パフォーマンスも低下するため、このようなオプションが提供されていない可能性があります。挿入ごとに、ID列全体を検索する必要があります。あなたはそれがパフォーマンスにどれほどの影響を与えるか想像することができます。

于 2012-06-01T17:39:32.407 に答える
5

データベースは、シーケンスに穴があるかどうかを気にしません。また、一般に、ID値のリストに穴が含まれないことを期待しないように、アプリケーションの設計を変更することは可能であり、おそらく簡単です。

奇妙な理由でそのような設計が必要な場合は、カスタムジェネレーターを使用する必要があります。実装の詳細は、次の質問で確認できます:Hibernate ID Generator

于 2012-06-01T17:33:51.753 に答える
0

これが内部でサポートされていない主な理由はセキュリティです。例を挙げましょう、

1.セキュリティ

一意の識別番号を持つモバイルSimCardのデータベースがあります。シムが失われた後、非アクティブ化した場合。しかし、他のユーザーが新しいシムを購入し、そのシムが(ロジックによって)あなたのシムが持っていた古い一意の番号を与えられたとしましょう。その後、問題が発生する可能性があります。たとえば、新しいユーザーがテロ行為を行ったとすると、警察はそのシム番号を追跡してあなたのところに来る可能性があります(彼は新しいユーザーであり、シムの一部ではまだあなたの名前しか表示されていないため)...

2.レイテンシー

そして間違いなくパフォーマンスの問題があります。未使用のシーケンス番号を見つけるための各検索は、単純なO(1)ではなくO(n)になります。

于 2017-09-02T12:24:05.913 に答える