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

        final MembreDTO membreDTO = pretDTO.getMembreDTO();
        final LivreDTO livreDTO = pretDTO.getLivreDTO();

        final List<PretDTO> membrePrets = new ArrayList<>(membreDTO.getPrets());

        try {
            if(membreDTO.getLimitePret().equals(String.valueOf(membrePrets.size()))) {
                throw new InvalidLoanLimitException("Le membre "
                    + membreDTO.getNom()
                    + " (ID de membre : "
                    + membreDTO.getIdMembre()
                    + ") a atteint sa limite de prêt ("
                    + membreDTO.getLimitePret()
                    + " emprunt(s) maximum)");
            }

            final List<ReservationDTO> reservations = new ArrayList<>(livreDTO.getReservations());
            if(!reservations.isEmpty()) {
                throw new ExistingReservationException("Le livre "
                    + livreDTO.getTitre()
                    + " (ID de livre : "
                    + livreDTO.getIdLivre()
                    + ") a des réservations"
                    + ")");
            }

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

        pretDTO.setMembreDTO(membreDTO);
        pretDTO.setLivreDTO(livreDTO);
        pretDTO.getMembreDTO().setNbPret(Integer.toString(Integer.parseInt(membreDTO.getNbPret()) + 1));
        pretDTO.setDatePret(new Timestamp(System.currentTimeMillis()));
        pretDTO.setDateRetour(null);

        addPret(session,
            pretDTO);

    }