私の質問は、データベースの設計と、その設計を Hibernate でモデル化する方法に関連しています。次の主キーを持つ 2 つのテーブルがあります。
BLOCK (BLOCK_ID)
BLOCK_SHP (BLOCK_ID, SHAPE_VERSION)
BLOCK から BLOCK_SHP は 1 対多の関係であり、1 つのブロックにさまざまなバージョンの形状を関連付けることができます。ここまでは順調ですね。
2 つ目の関連付けは、ブロックの現在の形状も取得できるようにしたいということです。これを行うために、BLOCK テーブルに別の属性を追加しました。
CUR_SHAPE_VERSION
BLOCK_ID と CUR_SHAPE_VERSION は、BLOCK_ID、SHAPE_VERSION の BLOCK_SHP テーブルへの外部キーを形成するようになりました。各ブロックは、0 または 1 つの現在の形状を持つことができます。
Hibernate では、この 2 番目の関連付けを次のように設定しました。
@OneToOne( カスケード = CascadeType.ALL、オプション = true ) @NotFound( アクション = NotFoundAction.IGNORE ) @JoinColumns( { @JoinColumn( name = "BLOCK_ID", referencedColumnName = "BLOCK_ID", insertable = false, updateable = false ), @JoinColumn( name = "CUR_SHAPE_VERSION", referencedColumnName = "SHAPE_VERSION", 挿入可能 = false, 更新可能 = false ) } ) public BlockShape getCurrentShape() { currentShape を返します。 }
Hibernate が null 許容の 1 対 1 の関連付けを処理する際に問題があったため、@NotFound アノテーションが必要でした。関連付けが見つからない場合は、エラーをスローする代わりに無視します。
ただし、Hibernate がエンティティ間の適切な関係を実際には認識していないことを意味するため、これはあまり満足のいくものではありません。たとえば、currentShape is not nullをクエリすると、Hibernate はこのクエリを適切に実行する方法を認識しません - block_id is not null または cur_shape_version is not nullをクエリしています。
それで、いくつか質問があると思います。まず、データベースでこの 2 番目の関連付けをモデル化するより良い方法はありますか? 第二に、関係をよりよく理解し、形状テーブルで適切にクエリできるようにするために、Hibernate で注釈を設定するためのより良い方法はありますか?
助けてくれてありがとう。