DAO调用DAO,DAO调用服务还是SQL联接?

时间:2019-03-09 20:09:11

标签: java web dao

因此,我正在编写一个个人项目以了解Web编程,并且遇到了DAO模式。我已经构建了一些类(模型),并且像几乎所有程序一样,它们都是嵌套的(例如:Payment类引用了Author实例)。 仅供参考,我没有使用任何映射器(将在以后的迭代中添加它们,并且我使用的是JDBC,而不是JPA)。

我的问题是这个:

当我创建PaymentJdbcDao时,我有一个方法将返回一些Payment,但是为了从数据库存储的对象创建此付款,我还必须联系Author(存储在单独的表中)。

我应该从PaymentJdbcDao调用UserJdbcDao以获得付款的作者,还是应该更改联接以从两个实体中检索字段的查询,还是应该让PaymentJdbcDao调用UserService(我认为这样做不好,因为服务位于daos之上的那一层),还是应该删除作者引用作为对象,而只保留对author_id的引用?

哪个住所是实现此目的的更合适方法?还是有其他更好的做法?

谢谢。

1 个答案:

答案 0 :(得分: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来获取所有用户的付款

希望我能为您提供帮助