Java 获取客户订单:设置<;订单>;getAllOrders()与Set的比较<;整数>;getAllOrders()

Java 获取客户订单:设置<;订单>;getAllOrders()与Set的比较<;整数>;getAllOrders(),java,orm,dns,Java,Orm,Dns,我没有做过太多的Java编程,因此在我的脑海中出现了许多未回答的ORM问题,对于经验丰富的人来说,这些问题似乎相当直接 假设我们有两个类:Customer和Order。Customer类实现了一个名为listAllOrders的方法,该方法的签名应该是什么 Set getAllOrders()//OOP方式 Set getAllOrders()//db友好的方式,基于每个订单都分配了唯一的int id的假设 int[]getAllOrders()//db友好方式,已优化 Set getAllOr

我没有做过太多的Java编程,因此在我的脑海中出现了许多未回答的ORM问题,对于经验丰富的人来说,这些问题似乎相当直接

假设我们有两个类:Customer和Order。Customer类实现了一个名为listAllOrders的方法,该方法的签名应该是什么

  • Set getAllOrders()//OOP方式

  • Set getAllOrders()//db友好的方式,基于每个订单都分配了唯一的int id的假设

  • int[]getAllOrders()//db友好方式,已优化

  • Set getAllOrders()//OOP方式,已优化

  • 其他的?通过方法重载实现上述功能的组合

  • 我的想法是立即放弃第三种选择,因为这种优化是不成熟的、不必要的,而且可能带来更多的麻烦而不是好处

    在第1个选项和第2个选项之间进行选择,主要的论点似乎是,在许多情况下,返回订单集合而不是id将是一种过激行为

    第一个选项总是需要将订单预加载到内存中,尽管一些订单属性可以通过延迟加载来处理,但订单对象本身仍然需要分配比一组裸id多得多的内存。另一个原因似乎是延迟加载不会给我使用
    final
    修饰符来强制订单字段的不变性带来好处

    然而,选项2并没有真正封装订单编号,也就是说,如果决定开始使用字符串UUID或long as order identifier而不是integer,则有必要进行认真的重写。显然,这可以通过引入一个名为OrderId的新的轻量级对象(第四种方法)来缓解


    嗯,在这一点上,我真的非常感谢来自ORM和Java专家的帮助

    知道打电话的人想要什么总是有帮助的。如果每次调用方都必须查找每个订单,那么返回订单id并不是一种优化。另一方面,如果大多数时候他们不需要所有这些信息,那么就没有任何回报


    大多数情况下,我会选择选项1。但是如果是像智能手机这样的内存受限的东西,我想我会选择延迟扩展。

    我建议使用选项一,因为您处理的是业务对象,而不是数字。如果您需要id,您仍然可以从订单中获得它。如果您使用smart或mapper,只有订单的主键才会被加载,直到您访问一些真实的数据——因此没有必要担心数据库或内存性能。

    我必须同意Paul Tomblin的观点,如果调用函数
    getAllOrders()
    我希望它返回订单对象(假设存在这样的类)。如果函数将返回更具体的内容,则应调用该函数。

    选项2与选项3类似,是过早的优化。你的客户想知道订单是什么;它甚至可能不关心订单的ID是什么。在某些情况下,客户机可能需要ID,但是如果您看到这种情况发生,您可能应该问为什么?找到一种直接对订单本身进行操作的方法。

    在你说出函数的返回值应该是什么之前,我会附和Paul Tomblin的说法,问题不是“最好做什么?”而是“实现这个目标的最好方法是什么?”,你必须决定打电话的人将如何处理这些信息。如果调用方想做的是,比如,为用户显示订单ID列表,然后返回订单ID。如果调用方希望显示订单日期、总成本和装运状态的列表,那么我将返回一组包含该数据的对象。等等。

    对于刚接触ORM工具的人来说,最困难的事情之一是他们尝试应用他们对数据库的知识以及在该环境中使用的优化(存储ID等)。我建议您使用对象,并在出现性能问题时解决它们


    大多数ORM为您处理这类问题;例如,Hibernate默认情况下会延迟加载一个集合(在您的例子中是订单)。在内部,它将为您存储一组ID值,但这并不是您的问题,因为您将只与对象和关联对象的集合进行交互。如果您关注域对象并认为是“OO”,您的ORM工具应该支持您,并允许您在以后需要时进一步优化。

    另一个选项会出现在您的脑海中:填充稀疏或延迟加载的Order对象-除非需要其他任何东西,否则只包含OrderID。。对这个有什么想法?