Вызов DAO DAO, служба вызовов DAO или соединение SQL? - PullRequest
0 голосов
/ 09 марта 2019

Итак, я пишу персональный проект, чтобы узнать о веб-программировании, и я наткнулся на шаблон DAO. Я построил некоторые классы (модели) и, как почти любая программа, они вложены (например, класс Payment имеет ссылку на экземпляр Author). Просто для справки, я не использую никаких карт (добавлю их на более поздней итерации, и я использую JDBC, а не JPA).

Мой вопрос такой:

Когда я создавал PaymentJdbcDao, у меня был метод, который будет возвращать некоторый Платеж, но чтобы создать этот платеж из сохраненного объекта базы данных, я должен также связаться с Автором (хранится в отдельной таблице).

Должен ли я вызвать UserJdbcDao из PaymentJdbcDao, чтобы получить автора платежа, если я изменю запрос с помощью объединения, чтобы получить поля из обеих сущностей, если PaymentJdbcDao вызывает UserService (я думаю, что это не хорошо, так как сервисы находятся на уровне выше уровня), или я должен удалить ссылку на автора как объект и просто сохранить ссылку на author_id?

Какой из аббатств является более подходящим способом для достижения этой цели? Или есть какой-то другой способ, который является лучшей практикой?

Спасибо.

1 Ответ

1 голос
/ 10 марта 2019

Я называю свои DAO (DataAccessObjects) "Хранилища".

Spring Data JPA также делает это.

Итак, я бы создал UserRepository и PaymentRepository.

Хранилища могут вызываться другими хранилищами или службами.

Службы никогда не должны вызывать хранилища.

UI -> Сервис -> Репозиторий.

Ваш платежный репозиторий может вернуть сущность, подобную этой

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, чтобы получать платежи всех пользователей

Я надеюсь, что смог вам помочь

...