DAO调用DAO,DAO调用服务还是SQL join?
Posted
技术标签:
【中文标题】DAO调用DAO,DAO调用服务还是SQL join?【英文标题】:DAO call DAO, DAO call service or SQL join? 【发布时间】:2019-07-31 13:32:26 【问题描述】:所以我正在编写一个个人项目来学习 Web 编程,并且遇到了 DAO 模式。我构建了一些类(模型),并且像几乎所有程序一样,它们是嵌套的(例如:Payment 类引用了 Author 实例)。 仅供参考,我没有使用任何映射器(将在以后的迭代中添加它们,我使用的是 JDBC,而不是 JPA)。
我的问题是这样的:
当我创建 PaymentJdbcDao 时,我有一个方法会返回一些付款,但为了从数据库存储的对象创建此付款,我还必须访问作者(存储在单独的表中)。
我是否应该从 PaymentJdbcDao 调用 UserJdbcDao 以获取付款的作者,我是否应该使用联接更改查询以从两个实体中检索字段,如果 PaymentJdbcDao 调用 UserService(我认为这不好,因为服务位于 daos 之上的层上),还是应该将作者引用作为一个对象删除并只保留对 author_id 的引用?
上面的哪一个是更合适的方法来实现这一点?或者还有其他更好的做法吗?
谢谢。
【问题讨论】:
如果对您有帮助,请标记为正确答案 【参考方案1】:我将我的 DAO (DataAccessObjects) 称为“存储库”。
Spring Data JPA 也在这样做。
所以我会创建一个 UserRepository 和一个 PaymentRepository。
存储库可以被其他存储库或服务调用。
服务不应该被存储库调用。
UI -> 服务 -> 存储库。
您的 PaymentRepository 可能会返回这样的实体
public class PaymentEntity
private long id;
private DateTime dateTime;
private UserEntity user;
您的 UserRepository 可以返回这样的实体
public class UserEntity
private long id;
private DateTime lastLogin;
private List<PaymentEntity> payments;
您的存储库可能如下所示。
public interface PaymentRepository
PaymentEntity getPaymentById(long id);
List<PaymentEntity> getAllPayments();
public interface UserRepository
UserEntity getUserById(long id);
List<UserEntity> getAllUsers();
因此,您的 PaymentRepository 将调用 UserRepository 以获取用户进行付款。
您的 UserRepository 会调用 PaymentRepository 来获取所有用户的付款
希望能帮到你
【讨论】:
以上是关于DAO调用DAO,DAO调用服务还是SQL join?的主要内容,如果未能解决你的问题,请参考以下文章