1

我遇到了一个休眠 hbm 配置,其中 id 属性映射到表中不是主键的列。该映射仅用于读取而不是更新。尽管这适用于大多数情况,但我发现在某些情况下,当在此映射上使用 get() 进行查询时,它会抛出org.hibernate.HibernateException: More than one row with the given identifier was found

所以我的问题是:

  • 如果我定义一个 id 映射到表中非主键的 hbm,它可以允许两个以上具有相同 id 的记录吗?
  • 在哪一层检查主键约束,休眠还是数据库?

谢谢,高拉夫。

4

1 回答 1

3

如果该列具有 PK 的所有功能,它将起作用:

  • 在表的所有行中唯一
  • 不可变

约束在数据库级别强制执行。但是 Hibernate 需要它的 ID 是唯一的。因此,如果两行在数据库中具有相同的 ID 并在同一个会话中加载,它将阻塞。

我看不出使用非 PK 列作为实体 ID 的任何充分理由,除非您被迫映射无法更改且未定义任何 PK 的旧表,即使如果可以将一列或一组列定义为 PK。

于 2013-08-22T09:31:03.167 回答