Hibernateを使用して、IDにマッピングしている列の1つがnull値を持つことができる複合IDを作成できますか?
これは、null値を持つことができるが、主キーを持たない一意のキーを持つレガシーテーブルを処理するためのものです。
テーブルに新しい主キー列を追加するだけでよいことに気付きましたが、これを回避する方法があるかどうか疑問に思っています。
いいえ。主キーを null にすることはできません。
エラーは発生しませんが、Hibernate は複合列の NULL 値を持つ行をエンティティにマップできません。これは、結果として NULL 値を持つエンティティを取得することを意味します。
残念ながら、いいえ。回避策を使用する必要がありました:
行を正確に2つの列(A、B)で識別できるビュー(テーブルではありません)に複合IDを使用しました。ただし、列の 1 つ (B) には、正の整数だけでなく null 値も含まれる場合があります。したがって、私の回避策は、ビューに新しい列「BKey」を作成することです。ビューは、B が null の場合、BKey の値が -1、そうでない場合は BKey = B のように記述されます (B と null には正の整数のみが発生します)。また、B の代わりに BKey を使用するように複合 ID の実装を変更しました。
これはお勧めできません。代わりにビューとマップを使用できますか? レガシーデータで立ち往生している場合は、 COALESCE を使用してデフォルトを提供できます。複合キーには多くの問題がありましたが、null 値はさらに多くの問題を引き起こすと思います。
複合キーの場合 (データベースが PK で null を許可すると仮定)、null を含む最大 number_of_cols^2 - 1 エントリを持つことができます (たとえば、2 列の複合キーの場合、主キー null を持つ 3 つの行を持つことができます。4 番目はnull のない PK)。
なぜそれをしたいのですか?複合 ID はテーブルの主キーをマップする必要があり、キーに null 値を入れるのは賢明ではありませんね。
編集: Hibernate では許可されていません。プロパティをキーの外に置き、DAO を少し調整して、必要に応じてフィールドを考慮に入れることができます。