java 代入 参照 型




エンティティIDとしてボックス型とプリミティブ型 (4)

現在のドキュメントではBoxed Typeの使用を推奨しています。

永続クラスに一貫して名前付きの識別子属性を宣言し、nullable(つまり、非プリミティブ)型を使用することをお勧めします。

JPA(Hibernate実装)ではエンティティIDとしてどの型を使用する方が良いですか?ボックス型( Integer型など)または非箱型( int型など)ですか?

あなたのプログラムで新しいエンティティを作成するとき、Hibernateはidがnullあり、データベースに新しい行を作成するはずであることを理解しているからです(idがnullでない場合、Hibernateはデータベース内の既存の行)。

しかし、私のエンティティのIDはintあり、エラーなく正常に動作し、プリミティブインスタンス変数のデフォルト値は0ことがわかりました。 だから彼は多分0を特殊なものとして扱い、オブジェクトが新しいオブジェクトであると仮定していると言った。


まあ、私たちは非プリミティブを使用しており、それに強い理由があります。 int/Integerなどのフィールドの多くは、完全な有効性をint/Integerためにzero絶対的なビジネス値を持っています。 例えば、債務勘定を考えてみましょう。債務不履行の場合、その欄がzero場合はそれ以上のものです。

問題は、プリミティブではゼロがデフォルト値なので、誤ってたとえばsetDebtで設定することを忘れる可能性があります。そのため、あなたが意図していない値でデータベースにアクセスする可能性があります。 この理由から、 Integerをいくつかのバリデーションと共に使用します。例えば、nullであってはいけません。 適切なバリデーションを追加することを忘れたとしても、そのコードはNullPointerException (おそらくテスト中)で破損する可能性があり、データベース内の一貫性のない値以上の例外が好きです。


エンティティおよびコレクションの一意の識別子は、バイナリ、blobおよびclobを除く任意の基本型であり得る。 (複合識別子も使用できます。下記を参照してください)。

基本的な値型はorg.hibernate.Hibernateで定義された対応するType定数を持っています。 たとえば、Hibernate.STRINGは文字列型を表します。


私たちはこれを次のように考えることができます:

x :: Intという値があるとき、 'x'は評価されるとIntかbottom(未定義)のどちらかを返す計算です。

プログラムが実行され、 xが評価されるとき、実際のInt(底部ではない)に評価されると仮定します。 そして、将来、xが評価されるときは、計算全体をやり直す代わりに、以前に計算した値を取得したいだけです。

これを達成するために何をするかは、以前計算された値を単純に返すサンクでxを計算するサンク(計算)に置き換えることです。

問題は、将来xを得る必要があるたびに、値を返す(些細な)コードへのこのポインタに従わなければならないということです。 これらの値が頻繁に必要な場合は、高価になります。

ボックス化されていない値を入力します。 ボックス化されていない値は、サンクの中にラップされていない、その低レベルの値です。 これは、プログラムが必ずしも死ぬことなく、定義できないという意味で厳格であることを意味します。





orm