package com.idega.core.persistence.impl; import java.util.List; import java.util.logging.Logger; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.idega.core.persistence.DaoFunctions; import com.idega.core.persistence.GenericDao; import com.idega.core.persistence.Param; import com.idega.util.expression.ELUtil; /** * @author <a href="mailto:civilis@idega.com">Vytautas Čivilis</a> * @version $Revision: 1.33 $ Last modified: $Date: 2009/04/16 13:23:09 $ by $Author: civilis $ */ @Repository("genericDAO") public class GenericDaoImpl implements GenericDao { private static Logger LOGGER; protected Logger getLogger() { if (LOGGER == null) LOGGER = Logger.getLogger(getClass().getName()); return LOGGER; } private EntityManager entityManager; @Autowired private DaoFunctions daoFunctions; protected EntityManager getEntityManager() { return entityManager; } @PersistenceContext public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } @Override @Transactional(readOnly = false) public void persist(Object product) { entityManager.persist(product); } @Override @Transactional(readOnly = false) public <T> T merge(T product) { return entityManager.merge(product); } @Override @Transactional(readOnly = true) public void refresh(Object product) { entityManager.refresh(product); } @Override @Transactional(readOnly = true) public <T> T getReference(Class<T> clazz, Object primaryKey) { return entityManager.getReference(clazz, primaryKey); } @Override @Transactional(readOnly = true) public <T> T find(Class<T> clazz, Object primaryKey) { return entityManager.find(clazz, primaryKey); } @Override @Transactional(readOnly = true) public Query createNamedQuery(String queryName) { return entityManager.createNamedQuery(queryName); } @Override @Transactional(readOnly = false) public void remove(Object obj) { entityManager.remove(obj); } @Override @Transactional(readOnly = false) public void mergeRemove(Object obj) { entityManager.remove(entityManager.merge(obj)); } @Override public boolean contains(Object obj) { return getEntityManager().contains(obj); } @Override @Transactional(readOnly = false) public void flush() { entityManager.flush(); } @Override @Transactional(readOnly = true) public <Expected> Expected getSingleResultByInlineQuery(String query, Class<Expected> expectedReturnType, Param... params) { return getQueryInline(query).getSingleResult(expectedReturnType, params); } @Override @Transactional(readOnly = true) public <Expected> Expected getSingleResult(String namedQueryName, Class<Expected> expectedReturnType, Param... params) { return getQueryNamed(namedQueryName).getSingleResult(expectedReturnType, params); } @Override @Transactional(readOnly = true) public <Expected> List<Expected> getResultListByInlineQuery(String query, Class<Expected> expectedReturnType, Param... params) { return getQueryInline(query).getResultList(expectedReturnType, params); } @Override public com.idega.core.persistence.Query getQueryNativeInline(String query) { return createNewQueryNativeInline(query); } @Override public com.idega.core.persistence.Query getQueryInline(String query) { return createNewQueryInline(query); } @Override public com.idega.core.persistence.Query getQueryNamed(String queryName) { return createNewQueryNamed(queryName); } @Override @Transactional(readOnly = true) public <Expected> List<Expected> getResultList(String namedQueryName, Class<Expected> expectedReturnType, Param... params) { return getQueryNamed(namedQueryName).getResultList(expectedReturnType, params); } protected com.idega.core.persistence.Query createNewQueryNativeInline(String queryExpression) { com.idega.core.persistence.Query q = ELUtil.getInstance().getBean(QueryNativeInlineImpl.beanIdentifier); q.setQueryExpression(queryExpression); return q; } /** * <p>Gets {@link com.idega.core.persistence.Query} and sets * {@link com.idega.core.persistence.Query * #setQueryExpression(String)} to queryExpression.</p> * @param queryExpression Hibernate HQL type query. * @return com.idega.core.persistence.Query with queryExpression set. */ protected com.idega.core.persistence.Query createNewQueryInline(String queryExpression) { com.idega.core.persistence.Query q = ELUtil.getInstance().getBean(QueryInlineImpl.beanIdentifier); q.setQueryExpression(queryExpression); return q; } protected com.idega.core.persistence.Query createNewQueryNamed(String queryExpression) { com.idega.core.persistence.Query q = ELUtil.getInstance().getBean(QueryNamedImpl.beanIdentifier); q.setQueryExpression(queryExpression); return q; } protected DaoFunctions getDaoFunctions() { return daoFunctions; } }