如果实体中没有定义标识符,Hibernate如何在内部跟踪对象?

如果实体中没有定义标识符,Hibernate如何在内部跟踪对象?,hibernate,Hibernate,根据Hibernate参考文件 标识符属性是严格可选的。你可以不说了 让Hibernate在内部跟踪对象标识符 如果实体中没有定义标识符,Hibernate如何在内部跟踪对象 进一步扩展问题,如果没有标识符,我们如何加载()/get()实体以使其持久化?这意味着您不必自己管理标识符,也不需要实体中的属性,但您至少需要一个备份字段来存储它并让Hibernate管理它,除了作为实体一部分且本身没有标识的组件之外。您的报价来自Hibernate的3.5版文档 在更高版本中,Hibernate是JPA提

根据Hibernate参考文件

标识符属性是严格可选的。你可以不说了 让Hibernate在内部跟踪对象标识符

如果实体中没有定义标识符,Hibernate如何在内部跟踪对象


进一步扩展问题,如果没有标识符,我们如何加载()/get()实体以使其持久化?

这意味着您不必自己管理标识符,也不需要实体中的属性,但您至少需要一个备份字段来存储它并让Hibernate管理它,除了作为实体一部分且本身没有标识的组件之外。

您的报价来自Hibernate的3.5版文档

在更高版本中,Hibernate是JPA提供程序。在JPA中,id声明不是可选的。因此,在3.6文档中,您会发现:

历史上,这被认为是一种选择。虽然还没有(尚未)实施,但这应该被视为一个不推荐使用的功能,因为在即将发布的版本中,完全需要它来提供标识符属性


Hibernate使用Java或对象标识来区分会话中的对象。您可以按常规方式加载/保存,但无法区分具有相同值的不同行。当然,不能按键加载,只能通过查询加载。在.

中提到了由此产生的一些限制。如何告诉Hibernate哪个是支持字段?您可以在映射中指定,您可以给出一些相同的示例吗???
,因此我们最终声明id,那么它是如何可选的?我从optional中了解到的是,我可以完全忽略声明它。。。如果我错了,请更正我引用的是第52页的“Hibernate参考文档3.5.6-Final”子标题“4.1.2.提供标识符属性(可选)”(如果您使用的是pdf版本),具体管理什么?会话中的对象因其Java对象标识而不同。没有主键意义上的附加标识符,因此无法将分离的对象合并到会话中。您将获得与创建不带主键的数据库表时相同的限制。您可以访问数据,但不能区分具有相同内容的行。这种操作模式在大多数情况下不是很有用。但正如文件中另一个地方和主题所述:“不建议这样做,但这是可能的。最终这是你的申请。”