他のコメントがあなたを誤解させているように思われるので、科学的で完全な答えをあなたに与えることはできませんが、私はこの問題について少し詳しく説明する義務があると感じています。@vcetinickは現在受け入れられている答えを書きました:
あなたは物事の永続性の側面から[..]逃げることができるかもしれないことに気付くかもしれません。
特にこの引用は間違っています。すべては、@Id
注釈を配置する場所によって異なります。仕様によると:
エンティティがフィールドベースのアクセス権を持っている場合、永続性プロバイダーのランタイムはインスタンス変数に直接アクセスします。
したがって、セッターまたはゲッターを提供する必要はありません。ゲッターメソッドではなくフィールドに注釈を付けたためです(セッターメソッドへの注釈は無視され、関係がありません)。
ただし、getterメソッドを記述し、フィールドの代わりに@Idアノテーションを付けてこのメソッドに注釈を付けた場合、永続性プロバイダーに、アクセサー(getter )メソッドとミューテーター(setter)メソッドを介してフィールドにアクセスし、リフレクションを使用しないように指示します。 。その場合、ゲッターとセッターの両方が存在する必要があります。本ProJPA2:MasteringtheJava™PersistenceAPIは、71ページに書いています(私による太字のマークアップ!):
プロパティアクセスモードを使用する場合、JavaBeansの場合と同じコントラクトが適用され、永続プロパティにはgetterメソッドとsetterメソッドが必要です。プロパティのタイプは、getterメソッドの戻りタイプによって決定され、setterメソッドに渡される単一のパラメーターのタイプと同じである必要があります。どちらの方法も、パブリックまたは保護された可視性である必要があります。
したがって、私は通常、idフィールドに注釈を付け、setterメソッドとgetterメソッドの両方を記述しますが、setterメソッドは保護されたアクセスを提供します。他のコードに、このような重要なフィールドへの簡単な書き込みアクセス権を持たせたくありません。これが他のドメインで問題を引き起こすかどうかはわかりません。私は専門家ではありません。しかし、この方法でid属性を設定しない理由についても理由がわかりません。Netbeansフォーラムも参照してください。