package org.multibit.mbm.db.dao.hibernate; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.multibit.mbm.db.dao.PurchaseOrderDao; import org.multibit.mbm.core.model.PurchaseOrder; import org.multibit.mbm.core.model.PurchaseOrderBuilder; import org.multibit.mbm.core.model.Supplier; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.stereotype.Repository; import java.sql.SQLException; import java.util.List; @Repository("hibernatePurchaseOrderDao") public class HibernatePurchaseOrderDao extends BaseHibernateDao<PurchaseOrder> implements PurchaseOrderDao { @SuppressWarnings("unchecked") @Override public Optional<PurchaseOrder> getById(Long id) { return getById(PurchaseOrder.class, id); } @Override public Optional<PurchaseOrder> getInitialisedPurchaseOrderBySupplier(Supplier supplier) { Preconditions.checkNotNull(supplier, "supplier cannot be null"); PurchaseOrder purchaseOrder; if (supplier.getPurchaseOrders().isEmpty()) { // Create a suitable purchaseOrder purchaseOrder = PurchaseOrderBuilder .newInstance() .withSupplier(supplier) .build(); } else { // TODO Need to differentiate between deliveries purchaseOrder = supplier.getPurchaseOrders().iterator().next(); } // Ensure we associate the Supplier and PurchaseOrder with the current session and initialise the collection hibernateTemplate.saveOrUpdate(supplier); hibernateTemplate.initialize(supplier.getPurchaseOrders()); return Optional.of(purchaseOrder); } /** * Initialize various collections since we are targeting the individual entity (perhaps for display) * * @param entity The entity * * @return The entity with all collections initialized */ @Override protected PurchaseOrder initialized(PurchaseOrder entity) { return entity; } @SuppressWarnings("unchecked") public List<PurchaseOrder> getAllByPage(final int pageSize, final int pageNumber) { return (List<PurchaseOrder>) hibernateTemplate.executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery("from PurchaseOrder"); query.setMaxResults(pageSize); query.setFirstResult(pageSize * pageNumber); return query.list(); } }); } @Override public PurchaseOrder saveOrUpdate(PurchaseOrder purchaseOrder) { Preconditions.checkNotNull(purchaseOrder, "purchaseOrder cannot be null"); hibernateTemplate.saveOrUpdate(purchaseOrder); return purchaseOrder; } /** * Force an immediate in-transaction flush (normally only used in test code) */ public void flush() { hibernateTemplate.flush(); } }