@Override
    public void utiliser(Session session,
        ReservationDTO reservationDTO) throws InvalidHibernateSessionException,
        InvalidDTOException,
        InvalidCriterionException,
        InvalidCriterionValueException,
        InvalidSortByPropertyException,
        ServiceException {
        if(session == null) {
            throw new InvalidHibernateSessionException("La session ne peut être null");
        }

        try {
            final MembreDTO unMembreDTO = reservationDTO.getMembreDTO();
            final LivreDTO unLivreDTO = reservationDTO.getLivreDTO();

            ReservationDTO uneReservationDTO = null;

            final List<ReservationDTO> reservations = new ArrayList<>(unLivreDTO.getReservations());

            if(!reservations.isEmpty()) {
                uneReservationDTO = reservations.get(0);
                final MembreDTO unMembre = uneReservationDTO.getMembreDTO();
                if(!reservationDTO.getMembreDTO().equals(unMembre)) {
                    throw new ExistingReservationException("Le livre "
                        + unLivreDTO.getTitre()
                        + " (ID de livre : "
                        + unLivreDTO.getIdLivre()
                        + ") a des réservations "
                        + "au membre "
                        + unMembre.getNom()
                        + ")");
                }
            }

            final List<PretDTO> livrePrets = new ArrayList<>(unLivreDTO.getPrets());
            for(PretDTO unPretDTO : livrePrets) {
                if(unPretDTO.getDateRetour() == null) {
                    final MembreDTO emprunteur = unPretDTO.getMembreDTO();
                    throw new ExistingLoanException("Le livre "
                        + unLivreDTO.getTitre()
                        + " (ID de livre : "
                        + unLivreDTO.getIdLivre()
                        + ") a été prêté à "
                        + emprunteur.getNom()
                        + " (ID de membre : "
                        + emprunteur.getIdMembre()
                        + ")");
                }
            }

            final List<ReservationDTO> membreReservations = new ArrayList<>(unMembreDTO.getReservations());

            if(unMembreDTO.getLimitePret().equals(String.valueOf(membreReservations.size()))) {

                throw new InvalidLoanLimitException("Le membre "
                    + unMembreDTO.getNom()
                    + " (ID de membre : "
                    + unMembreDTO.getIdMembre()
                    + ") a atteint sa limite de prêt ("
                    + unMembreDTO.getLimitePret()
                    + " emprunt(s) maximum)");
            }

            final PretDTO unPretDTO = new PretDTO();
            unPretDTO.setMembreDTO(unMembreDTO);
            unPretDTO.setLivreDTO(unLivreDTO);
            unPretDTO.setDatePret(new Timestamp(System.currentTimeMillis()));
            unPretDTO.setDateRetour(null);
            getPretDAO().add(session,
                unPretDTO);
            reservationDTO.getLivreDTO().getReservations().remove(reservationDTO);
            annuler(session,
                uneReservationDTO);
        } catch(
            DAOException
            | ExistingReservationException
            | ExistingLoanException
            | InvalidLoanLimitException ex) {
            throw new ServiceException(ex);
        }
    }