设计DAO方法和嵌套实体

时间:2018-01-08 21:19:01

标签: java jdbc dao

我正在研究使用普通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方法时:

  • getVehicleById,
  • getVehiclesByBrand,
  • getUserById

我必须获取有关Person,所有AddresesBankAccounts的信息(它们是1..n,因此必须提取多行并存储在地图中)< / p>

我考虑了一些解决方案,但他们感觉像是一些解决方法,而不是我问题的真正答案:

  • UserDAOVehicleDAO中创建两个方法:一个将获取完整的entites,第二个方法将仅获取有关Person的基本信息(不{{1} }和Addreses)。 使用此解决方案并不优雅,因为如果Person没有任何addreses或者他们只是没有被提取,则无法确定。

  • 制作两个BankAccounts模型:PersonPerson然而,这将导致完整的混乱和有趣的名称,如PersonWithAddressPersonWithXyzButWithoutYvz

  • 在VehicleDAO中获取仅与Vehicle直接关联的信息。 如果需要,使用PersonDAO获取Rest对象。 当需要所有信息时,这将导致1 + n选择(1列表车辆,n表示所有车主)

在我读到的时候,DAO层应该完全不知道视图。在视图中,我提供有关车辆的信息以及所有者的名字和姓氏。此时获取所有信息是不必要的。但是在DAO和View之间还有可能需要该数据的其他层(服务)。

提前感谢您的帮助。

0 个答案:

没有答案