2016-04-07 12 views
0

オブジェクトのIDを非連続的に生成する方法を教えてください。私はIDが線形シーケンスではなく、予測可能であることを好みます。しかし、@GeneratedValueの世代戦略はAUTO, TABLE, IDENTITY, SEQUENCEです。そのような(自動)オプションはありますか?または私はそれを自分で生成する必要がありますか? (そのIDが既に存在するかどうかを確認してください)Hibernateが非順次にエンティティIDを生成する

これは、予測可能な線形IDを持つことが理想的ではないと感じています。私は正しいですか?たとえば、非公開のYouTube動画やGoogleドライブの共有リンクなどのリソースでは、IDを順番に処理するのは本当に簡単であるため、IDを順番に保持するのは大きな欠陥です。

+0

http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators-uuid –

答えて

0

私の推奨するベストプラクティスは、内部の主キーを外部の顧客に公開しないようにすることです。あなたが言及した簡単に推測される値の他に、データベースを後で統合すること(例えば、複数のprodインスタンスを結合する場合や、データ設計をリファクタリングする場合など)も難しくなります(現在の主キーはもはや有効ではありません/有用/何でも)。

IDをローカルアプリケーション内に保存すると、シーケンシャルPKを使用するのはデータベース内でのみ使用され、多くのRDBMでは一般的なアプローチなのでうまくいきます。

これで、コンシューマが望む特定のXYZをプルアップできるようにするために、ビジネス派生固有の識別子が必要になりました。単一列でも複数列でもかまいませんが、その意味はデータベースの意味よりもビジネス上の意味を持つ必要があります。私はGUID/UUIDを使用するのが好きですが、理論的には可能ですが、オーバーラップはほとんどありません(ただし、実装によって異なります)。ただし、GUIDをPKとして使用したくない場合は、FK関係に関連するバイト数が増えますが、整数は実質的に小さくなります。

コンシューマが使用できる非シーケンシャルIDを実際に使用する場合は、ランダム化を行うデータベースビューを作成し、それを@GeneratedValue(免責事項:I私はいつもシーケンスジェネレータを使いましたが、理論的にはうまくいくかもしれません)。

関連する問題