获取客户订单:设置<order> getAllOrders()与Set <integer> getAllOrders()</integer> </order>

时间:2009-05-11 16:46:59

标签: java orm dns

我没有做太多的Java编程,因此很多未解决的ORM问题在我脑海中浮现,对于更多经验丰富的人来说似乎相当直接。

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

  1. Set<Order> getAllOrders(); // OOP方式

  2. Set<Integer> getAllOrders(); // db-friendly方式,基于假设每个订单都分配了唯一的int id

  3. int[] getAllOrders(); //数据库友好的方式,优化

  4. Set<OrderID> getAllOrders(); // OOP方式,优化

  5. 其他?以上通过方法重载的组合?

  6. 我的想法是立即解雇第三个选项,因为优化是不成熟的,不需要的,并且可能会导致更多麻烦而不是好处。

    在第一个和第二个选项之间进行选择,主要论点似乎是在许多情况下返回一个订单集合而不是id's将是一个过度杀伤。

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

    但是,选项2并没有真正封装订单编号,即如果决定开始使用字符串UUID或长期作为订单标识符而不是整数,则需要进行严格的重写。显然,这可以通过引入一个名为OrderId的新轻量级对象(第四种方法)来缓解。

    那么,在这一点上,我非常感谢ORM和Java大师的一些帮助!

6 个答案:

答案 0 :(得分:4)

了解来电者想要的内容总是有帮助的。如果每次返回订单ID都不是优化,则调用者将不得不查找每个订单。另一方面,如果大多数时候他们不需要所有这些信息,那么就没有任何回报。

我会在大多数时候选择选项1。但如果它像智能手机一样受到记忆的限制,我想我会选择懒惰的扩张。

答案 1 :(得分:2)

对于ORM工具不熟悉的人最难的事情之一是他们尝试应用他们对数据库的知识以及在该上下文中使用的优化(存储ID等)。我建议您使用对象,并解决性能问题,如果它们出现。

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

答案 2 :(得分:1)

我建议使用选项一,因为您正在处理业务对象而不是弄乱数字。如果您需要id,您仍然可以从订单中获取。如果您使用智能OR映射器,则只有在您访问某些实际数据之前才会加载订单的主键 - 因此无需了解数据库或内存性能。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我会回应保罗·汤姆林说的问题不是“最好的事情是什么?”但“实现这一目标的最佳途径是什么?”在你可以说出函数的返回值应该是什么之前,你必须决定调用者将如何处理这些信息。如果调用者想要做的是,比如显示用户的订单ID列表,则返回订单ID。如果呼叫者想要显示订单日期,总成本和发货状态的列表,那么我将返回一组包含该数据的对象。等