我正在研究使用普通JDBC连接数据库的项目。我试图使其更加维护友好并重构一些获取数据的结构和查询。
我遇到了一些我无法弄清楚的设计问题。
数据库表(简化):
Person
int id,
varchar firstName,
varchar lastName,
date dateOfBirth,
PersonAddress
int id,
int personId,
int cityId,
int countryId,
PersonBankAccount
int id,
int personId,
varchar accountIBAN
每个人都可以有多个地址和多个银行帐户(1..n)。那么Person最合理的java实体就是:
class Person {
Integer id;
List<PersonAddress> addreses;
List<PersonBankAccount> bankAccounts;
}
class PersonAddress {
Integer id;
Integer personId;
City city;
Country country;
}
使用PersonAddress可以。没有链接到城市和国家表格,没有任何意义。
当它为与Person关联但不直接关联的实体实现DAO时出现问题。没有它,这些实体可能存在。例如:
class User {
Integer id;
String username;
Date registeredOn;
... some other fields
Person person;
}
class Vehicle {
Integer id;
Person vehicleOwner;
VehicleBrand brand;
VehicleType type;
}
所以,每次我想实现DAO方法时:
我必须获取有关Person
,所有Addreses
和BankAccounts
的信息(它们是1..n,因此必须提取多行并存储在地图中)< / p>
我考虑了一些解决方案,但他们感觉像是一些解决方法,而不是我问题的真正答案:
在UserDAO
,VehicleDAO
中创建两个方法:一个将获取完整的entites,第二个方法将仅获取有关Person
的基本信息(不{{1} }和Addreses
)。
使用此解决方案并不优雅,因为如果Person没有任何addreses或者他们只是没有被提取,则无法确定。
制作两个BankAccounts
模型:Person
,Person
。 然而,这将导致完整的混乱和有趣的名称,如PersonWithAddress
或PersonWithXyzButWithoutYvz
在VehicleDAO中获取仅与Vehicle直接关联的信息。 如果需要,使用PersonDAO获取Rest对象。 当需要所有信息时,这将导致1 + n选择(1列表车辆,n表示所有车主)
在我读到的时候,DAO层应该完全不知道视图。在视图中,我提供有关车辆的信息以及所有者的名字和姓氏。此时获取所有信息是不必要的。但是在DAO和View之间还有可能需要该数据的其他层(服务)。
提前感谢您的帮助。