@Override
    public void placer(Session session,
        ReservationDTO reservationDTO) throws InvalidHibernateSessionException,
        InvalidDTOException,
        InvalidCriterionException,
        InvalidCriterionValueException,
        InvalidSortByPropertyException,
        ServiceException {
        if(session == null) {
            throw new InvalidHibernateSessionException("La session ne peut être null");
        }
        if(reservationDTO == null) {
            throw new InvalidDTOException("La réservation ne peut être null");
        }
        final MembreDTO unMembreDTO = reservationDTO.getMembreDTO();
        final LivreDTO unLivreDTO = reservationDTO.getLivreDTO();

        final List<PretDTO> prets = new ArrayList<>(unLivreDTO.getPrets());

        try {
            if(prets.isEmpty()) {
                throw new MissingLoanException("Le livre "
                    + unLivreDTO.getTitre()
                    + " (ID de livre : "
                    + unLivreDTO.getIdLivre()
                    + ") n'est pas encore prêté");
            }
            boolean aEteEmprunteParMembre = false;
            for(PretDTO pretDTO : prets) {
                aEteEmprunteParMembre = unMembreDTO.equals(pretDTO.getMembreDTO());
            }
            if(aEteEmprunteParMembre) {
                throw new ExistingLoanException("Le livre "
                    + unLivreDTO.getTitre()
                    + " (ID de livre : "
                    + unLivreDTO.getIdLivre()
                    + ") est déjà prêté à "
                    + unMembreDTO.getNom()
                    + " (ID de membre : "
                    + unMembreDTO.getIdMembre()
                    + ")");
            }
            final List<PretDTO> membrePrets = new ArrayList<>(unMembreDTO.getPrets());

            if(unMembreDTO.getLimitePret().equals(String.valueOf(membrePrets.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 List<ReservationDTO> reservations = new ArrayList<>(unLivreDTO.getReservations());

            for(ReservationDTO uneAutreReservationDTO : reservations) {
                if(unLivreDTO.equals(uneAutreReservationDTO.getLivreDTO())) {
                    throw new ExistingReservationException("Le livre "
                        + unLivreDTO.getTitre()
                        + " (ID de livre : "
                        + unLivreDTO.getIdLivre()
                        + ") est déjà réservé pour quelqu'un d'autre");
                }
            }
        } catch(
            MissingLoanException
            | ExistingLoanException
            | ExistingReservationException
            | InvalidLoanLimitException ex) {
            throw new ServiceException(ex);
        }

        reservationDTO.setDateReservation(new Timestamp(System.currentTimeMillis()));
        addReservation(session,
            reservationDTO);

    }