gpt4 book ai didi

hibernate - 我的 Hibernate 映射中的值对象或实体对象?

转载 作者:行者123 更新时间:2023-12-04 23:33:32 25 4
gpt4 key购买 nike

我正在尝试设计一个非常简单的应用程序,但我对 Hibernate 对实体和值对象的定义(如 Java Persistence with Hibernate 的第 4 章中所定义)感到有些困惑。

我拥有的是一个带有客户的应用程序,他们可以下订单(一对多关系)。这些订单中的每一个都有许多订单行(也是一对多)。现在,我认为客户有身份(客户编号),订单(订单编号)也是如此,因此它们是实体对象?我的困惑来自订单行。

订单行具有数量、产品编号和价格。订单行没有订单就不能存在,也没有自己的身份,因此我将其视为值对象。但是我不能将订单行作为订单表的一部分,因为订单与其订单行之间存在一对多的关系。一对多关系如何处理值对象的定义?来自 Hibernate 的书:

"An object of value type has no database identity; it belongs to an entity instance and its persistent state is embedded in the table row of the owning entity. Value types don't have identifiers or identifier properties"



如果有人能解决我的困惑,我将不胜感激:)

最佳答案

Hibernate 的文档区分了实体类型和值类型,而不是值对象。

  • Object of Entity Type : has its own database identity
  • Object of Value Type : belongs to an entity, and its persistent state is embedded in the table row of the owning entity. Value types don't have identifiers or identifier properties.


据我所知,这本书使用了一个示例,其中 address 表示为单个 String 和一个 user 对象,其中包含一个地址字符串:
  • 实现为值类型(通常是指数据库级别的同一个表中的列),如果用户被删除,则其地址也被删除。没有用户,地址就不能存在,也不能共享。
  • 作为实体类型实现(这可能意味着使用单独的表),地址将在没有用户的情况下独立存在,并且两个用户将能够共享相同的地址。

  • 在您的情况下,订单行不属于订单,其持久状态未嵌入订单行(没有意义),它有自己的身份(由 orderId 和 productId 组成)。订单行绝对不是值类型,它是实体类型。

    实际上,只要您考虑关联(一对一、一对多等),您就肯定在操纵实体。

    关于hibernate - 我的 Hibernate 映射中的值对象或实体对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1695930/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com