私が働いている会社では、プリミティブ(Java.lang.Integer、Java.lang.Long)のラッピングクラスを使用する方が良いのか、それともマップするPOJOで直接プリミティブ型を使用するのかについて、この大きな議論があります。 Hibernateのテーブルへのエンティティ。
考えは、これらの値がデータベースでnullにならないようにすることです。
プリミティブの使用を支持する引数:
ラッパーオブジェクトの使用を支持する引数:
ラッパーを使用して、あなたの人生をシンプルにします。
データモデルでこれを指定する必要があります。とにかく、データベースでnull値を許可する必要があります。
データベースでnullが許容される場合は、ラッパーを使用します。 null可能ではなく、ラッパーを使用している場合、nullをデータベースに挿入しようとすると例外が発生します。
データモデルで指示されていない場合は、規則に従って、常にラッパーを使用してください。そうすれば、人々は考えたり、値0がnullを意味すると決定したりする必要がなくなります。
また、パフォーマンスが低下するというアサーションについても質問します。これを測定しましたか?本当に測定したということですか?データベースと通信する場合、16ビットと32ビットの違いよりも多くの考慮事項があります。
シンプルで一貫したソリューションを使用してください。誰かがveryを与えない限り、どこでもラッパーを使用します---(正確な測定された統計で)それ以外の場合に行う正当な理由。
それが言及されるべきだと思った:
永続クラスで非プリミティブプロパティを使用するHibernateの推奨事項(セクション4.1.2)は、実際には、タイトル付きでidentifierプロパティを参照しています。
4.1.2。識別子プロパティを提供する
猫にはidというプロパティがあります。このプロパティは、データベーステーブルの主キー列にマップします。プロパティは何でも呼び出され、そのタイプはプリミティブタイプ、プリミティブな「ラッパー」タイプ、Java.lang.StringまたはJava.util.Dateである可能性があります。
...
永続クラスで一貫した名前の識別子プロパティを宣言し、null許容型(つまり、非プリミティブ)型を使用することをお勧めします。
それにもかかわらず、プリミティブの利点は強くありません。
Hibernateのドキュメント (たまたま見つけた最初のバージョンのみ)は次のように述べています。
プロパティは何でも呼ばれ、そのタイプはプリミティブタイプ、プリミティブな「ラッパー」タイプ、Java.lang.StringまたはJava.util.Dateである可能性があります。
...
永続クラスで一貫した名前の識別子プロパティを宣言し、null許容型(つまり、非プリミティブ)型を使用することをお勧めします。
したがって、「専門家の声」はInteger
/Long
...の使用を提案していますが、説明されていませんwhyこれが事実です。
まだ永続化されていないオブジェクトを作成できるようにするためかどうかなし識別子(つまり、null
のプロパティ値を持つ)を永続化されたエンティティと区別します。