web-dev-qa-db-ja.com

休止状態マッピングでのラッパー整数クラスまたは整数プリミティブの使用

私が働いている会社では、プリミティブ(Java.lang.Integer、Java.lang.Long)のラッピングクラスを使用する方が良いのか、それともマップするPOJOで直接プリミティブ型を使用するのかについて、この大きな議論があります。 Hibernateのテーブルへのエンティティ。

考えは、これらの値がデータベースでnullにならないようにすることです。

プリミティブの使用を支持する引数:

  • これらの値をintとして処理するということは、これらの値がnullになることは決してないことを意味します。このようにして、フィールドで誤ってnull参照を取得することができなくなります。
  • int = 32/64ビットのメモリ。整数= 16バイトのメモリで、速度も遅い

ラッパーオブジェクトの使用を支持する引数:

  • データベースレベルで制約を追加して、常にnull値が到達しないようにすることができます。
  • ユーザーが値を設定せず、バグのあるデータが難しい場合は、データベースにnullの代わりに0が含まれる可能性があります。
  • オブジェクトはプリミティブよりも表現力があります。 null値と整数値もあるので、たとえばアノテーション(javax.validation.constraints.NotNull)を使用して簡単に検証できます。
38
vanvasquez

ラッパーを使用して、あなたの人生をシンプルにします。

データモデルでこれを指定する必要があります。とにかく、データベースでnull値を許可する必要があります。

データベースでnullが許容される場合は、ラッパーを使用します。 null可能ではなく、ラッパーを使用している場合、nullをデータベースに挿入しようとすると例外が発生します。

データモデルで指示されていない場合は、規則に従って、常にラッパーを使用してください。そうすれば、人々は考えたり、値0がnullを意味すると決定したりする必要がなくなります。

また、パフォーマンスが低下するというアサーションについても質問します。これを測定しましたか?本当に測定したということですか?データベースと通信する場合、16ビットと32ビットの違いよりも多くの考慮事項があります。

シンプルで一貫したソリューションを使用してください。誰かがveryを与えない限り、どこでもラッパーを使用します---(正確な測定された統計で)それ以外の場合に行う正当な理由。

36
Matthew Farwell

それが言及されるべきだと思った:

永続クラスで非プリミティブプロパティを使用するHibernateの推奨事項(セクション4.1.2)は、実際には、タイトル付きでidentifierプロパティを参照しています。

4.1.2。識別子プロパティを提供する

猫にはidというプロパティがあります。このプロパティは、データベーステーブルの主キー列にマップします。プロパティは何でも呼び出され、そのタイプはプリミティブタイプ、プリミティブな「ラッパー」タイプ、Java.lang.StringまたはJava.util.Dateである可能性があります。

...

永続クラスで一貫した名前の識別子プロパティを宣言し、null許容型(つまり、非プリミティブ)型を使用することをお勧めします。

それにもかかわらず、プリミティブの利点は強くありません。

  1. プロパティに一貫性のある非null値があることは、潜んでいるバグの追跡が難しいため、NullPointerExceptionよりも悪くなります。問題が検出されるまでコードが記述されてから完全に異なるコードコンテキストに表示されるまで、さらに時間がかかるそのソース。
  2. パフォーマンスについて:コードをテストする前に-通常、これは時期尚早の検討事項です。安全を第一に考えるべきです。
11
yair

Hibernateのドキュメント (たまたま見つけた最初のバージョンのみ)は次のように述べています。

プロパティは何でも呼ばれ、そのタイプはプリミティブタイプ、プリミティブな「ラッパー」タイプ、Java.lang.StringまたはJava.util.Dateである可能性があります。

...

永続クラスで一貫した名前の識別子プロパティを宣言し、null許容型(つまり、非プリミティブ)型を使用することをお勧めします。

したがって、「専門家の声」はInteger/Long...の使用を提案していますが、説明されていませんwhyこれが事実です。

まだ永続化されていないオブジェクトを作成できるようにするためかどうかなし識別子(つまり、nullのプロパティ値を持つ)を永続化されたエンティティと区別します。

5
Jon Skeet