package de.rwth.idsg.bikeman.psinterface.repository;
import de.rwth.idsg.bikeman.domain.Booking;
import de.rwth.idsg.bikeman.domain.Reservation;
import de.rwth.idsg.bikeman.domain.Transaction;
import de.rwth.idsg.bikeman.repository.BookingRepository;
import de.rwth.idsg.bikeman.web.rest.exception.DatabaseException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
/**
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
* @since 16.06.2015
*/
@Repository
@Slf4j
public class PsiBookingRepositoryImpl implements PsiBookingRepository {
@PersistenceContext private EntityManager em;
@Inject private BookingRepository bookingRepository;
@Override
public Booking save(Booking booking) {
return bookingRepository.save(booking);
}
@Override
@Transactional(readOnly = true)
public Booking findByTransaction(Transaction transaction) {
final String query = "SELECT b FROM Booking b WHERE b.transaction = :transaction";
try {
return em.createQuery(query, Booking.class)
.setParameter("transaction", transaction)
.getSingleResult();
} catch (NoResultException e) {
throw new DatabaseException("Could not find booking for specified transaction " + transaction, e);
}
}
@Override
public Booking findByReservation(Reservation reservation) {
final String query = "SELECT b FROM Booking b WHERE b.reservation = :reservation";
try {
return em.createQuery(query, Booking.class)
.setParameter("reservation", reservation)
.getSingleResult();
} catch (NoResultException e) {
throw new DatabaseException("Could not find booking for specified reservation " + reservation, e);
}
}
}