我有一些实体类与其他实体具有一对一和/或一对多的关系。
我尝试制作一个非常通用的示例来反映我的情况......假设我将以下表存储在数据库中(不允许空值):
operations (ID, workerID, customerID, etc_etc)
workers (ID, email, password, etc_etc)
customers (ID, etc_etc)
mobilePhones (workerID, phoneNumber)
应该很清楚的是:
- 1 个操作只有 1 个工人和1 个客户。
- 1位客户至少有 1 个手机号码。
因此我有以下实体类:
public class Customer {
private int id;
//other fields, then constructors, getters and setters
}
public class Worker {
private int id;
//other fields
private String[] mobilePhones;
}
正如我在标题中已经说过的,我不能使用Hibernate 之类的 ORM,所以我将使用 DAO。
{编辑:我应该知道你很想知道为什么我不能使用 ORM ......好吧,正如我在下面的评论中写的:这是一项作业(软件工程考试的项目)。}
现在,我想我不会有任何问题,它可以通过从所有电话号码中选择等于实际工人 ID 的WorkerDAO
方式轻松管理一对多关系。mobilePhones
workerID
对我来说真正的问题是如何管理 anOperation
与其关联Worker
和Customer
. 如果我想避免浪费内存,我应该这样设计我的Operation
实体:
public class Operation { // here I have some doubts
private int id;
private int workerId;
private int customerId;
//other fields
}
或者可能是这样的:
public class Operation { // here I have some doubts
private int id;
private Worker worker;
private Customer customer;
//other fields
}
?
后者似乎更面向对象,但有一个微不足道的含义:工作者和客户的实例必须在内存中,即使客户Operation
可能不需要它们。
更糟糕的是:如果OperationDAO
将 worker 和 customer 设置为新的 Worker 和 Customer 实例,这将导致在内存中保留多个引用同一个 worker/customer 的实例(例如,由同一个 worker 执行的两个操作)。除了内存浪费之外,这肯定会导致数据不一致(例如,一个实例被修改而没有更新其他实例)。
为了避免这种情况,应该引入一些知道当前加载了哪些实例的类(例如,使用类似 , 等的东西List<Worker>
)List<Customer>
......老实说,这在我看来是一种矫枉过正。
我还认为我可以尝试实现某种惰性获取,例如仅在第一个请求时设置工作实例,但我仍然需要一些类来跟踪内存中的内容以及必须查询的内容;我什至不知道这个类是否应该与数据访问逻辑或业务逻辑相关(我猜是前者,但仍然不确定)。
无论如何,没有理由实现所有这些,因为我不需要缓存系统(而且我觉得它看起来很像那样)。
有什么建议吗?