当前位置: 首页 > 知识库问答 >
问题:

在Java中实现对象列表的最佳实践

甄志
2023-03-14

我目前正在改进一些旧的uni分配,将它们从可序列化文件转移到任何其他形式的存储,主要是SQL数据库。我理解关系数据库设计的概念以及与OOP类的相似之处,但是,我不完全确定如何从OOP设计的角度来处理这个问题。

现在我有一个酒店类,房间列表为属性,每个房间都有一个客人列表为属性(此处为完整代码

回到使用文件时,我可以用Serializable接口标记这些类,并将父对象存储在单个文件中。但是当使用关系数据库时,我将每个列表存储为单个表,并使用单独的查询来获得相应的结果。add()操作也是如此:对于数据库,我可以做类似Guest.add()的事情,并将所有必需的字段直接添加到数据库中,而对于我目前的设计,我需要调用Room.getGuestList()。add()(或类似的方法)。

我完全理解这两种方法都不理想,因为这两个类都应该只关心存储数据,而不关心add方法的实现,但即使我在一个类中分离了它,我是否仍要在每个类中定义一个List属性?

我很确定我错过了一个设计模式,但我找不到一个能解决这个问题的模式,或者可能只是我被教错了。

谢谢你的回答

编辑:多亏了提供的答案,我决定按照本问题和Oracle文档中解释的DAO模式转换我的实现。

共有1个答案

袁帅
2023-03-14

通常你会有三张桌子:酒店、房间、客人。房间与酒店(酒店id)相关,而客人与房间(房间id)相关。就这样。使用某种ORM,这些关系可以很容易地反映在OOP中。带有Hibernate的JPA就是一个很好的例子。看看这个。您将能够像您描述的那样获取酒店、其房间和酒店的所有客人,而无需在代码中使用一个SQL查询。

 类似资料:
  • 我正在(用Java)研究递归图像处理算法,该算法从中心点向外递归遍历图像的像素。 不幸的是,这会导致堆栈溢出。所以我决定切换到基于队列的算法。 现在,这一切都很好,但是考虑到它的队列将在很短的时间内分析数千个像素,同时不断弹出和推送,而不保持可预测的状态(长度可能在100到20000之间),队列实现需要具有显著的快速弹出和推送能力。 链表似乎很有吸引力,因为它能够将元素推到自己身上,而无需重新排列

  • 问题内容: 我(使用Java)正在研究一种递归图像处理算法,该算法以递归方式从中心点向外遍历图像的像素。 不幸的是,这会导致堆栈溢出。因此,我决定切换到基于队列的算法。 现在,这一切都很好而且很花哨- 但考虑到以下事实:它的队列将在非常短的时间内分析成千上万个像素,同时不断弹出并推动,而不会保持可预测的状态(长度可能在100到100之间,和20000),则队列实现需要具有显着的快速弹出和推送功能。

  • 在Java页面对象模型中创建步骤时实例化对象的最佳方法是什么? 有人知道Cucumber脚本是如何编译的吗? 我想,如果一切都建成并符合要求,下面的第二个或第三个选项可能是最好的方法。 如果只编译与正在执行的测试相关的步骤,那么我想这将是第一个。 我举了以下例子: 以上所有步骤(在同一个LoginSteps.java类中加上更多)从以下开始 这是最好的方法,还是创建单个实例更好? 或者在Login

  • 问题内容: 我有一个说“销售”的对象列表。我只需要其产品与另一个列表(例如saleProductList)中的对象匹配的Sales对象。 除了循环以外,还有没有更好的方法可以做到这一点。 问题答案: 如果您已经在使用Google的Guava库,则它具有Collections2.filter()方法,该方法将仅返回集合中与给定Predicate匹配的项。 但是,这是否能回答您的问题取决于您避免循环的

  • 引子 Rax 提供的长列表标签有很多,在什么场景下使用什么列表组件,怎样选择列表组件性能会更好,这些问题可能会给刚接触 Rax 的同学带来困扰。本文结合 Rax 0.5 发布版本对列表能力进行一次详细的梳理。 如何让页面滚动 在开始正题之前先说说为什么要有长列表的概念,以及如何让页面可以滚动。 传统的 Web 页面天生在浏览器里就是可以滚动的,我们额外引入一个滚动容器的概念好像比较多余。但当我们做

  • null 将整个object1作为完整的JSON存储在my key下。 将object2与它自己的键一起存储在我的object1序列化中,以将object2键作为引用,并且当从缓存中拉回时,也通过它的键拉出object2。 我觉得选项1是最好的实践,也是最有效的,但我有第二个想法,将大的嵌套对象存储在on键下。