1

id 属性が主キーではないテーブルの列にマップされている休止状態の hbm 構成に遭遇しました。マッピングは読み取りのみに使用され、更新には使用されません。これはほとんどの場合に機能しますが、このマッピングで get() を使用してクエリを実行すると、 org.hibernate.HibernateException: More than one row with the given identifier was found がスローされる場合がいくつか見つかりました。

だから私の質問は:

  • テーブル内の非主キーにマップされた ID を使用して hbm を定義すると、同じ ID を持つ 3 つ以上のレコードを許可できますか?
  • 主キー制約がチェックされるのは、休止状態またはデータベースのどのレイヤーですか?

ありがとう、ガウラフ。

4

1 に答える 1

3

列に PK のすべての機能がある場合に機能します。

  • テーブルのすべての行の中で一意
  • 不変

制約はデータベース レベルで適用されます。しかし、Hibernate はその ID が一意である必要があります。そのため、2 つの行がデータベースで同じ ID を持ち、同じセッションでロードされると、チョークします。

非 PK 列をエンティティの ID として使用する正当な理由がわかりません。ただし、変更できず、PK が定義されていないレガシー テーブルをマップする必要がある場合を除きます。 1 つの列または列のセットを PK として定義できる場合。

于 2013-08-22T09:31:03.167 に答える