package com.axxx.dps.apv.persistence;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;
/**
*
* To be used by the web layer.
* This is the business layer, that marks transactional boundaries.
*
* @author mdutoo
*
* @param <T>
*/
//@Transactional(readOnly=true)
// NB. if no session in view filter, tx would always be required only to close session at its end
// (at least only readOnly by default)
public abstract class GenericEntityServiceImpl<T extends GenericEntity<T>> implements GenericEntityService<T> {
/** to be implemented by returning an autowired field */
protected abstract GenericEntityDao<T> getGenericDao();
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#getEntity(java.lang.Class, java.lang.Integer)
*/
@Override
public GenericEntity<?> getEntity(Class<? extends GenericEntity<?>> clazz, Integer id) {
return getGenericDao().getEntity(clazz, id);
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#getById(java.lang.Number)
*/
@Override
public T getById(Number id) {
return getGenericDao().getById(id);
}
protected T getByField(String fieldName, String fieldValue) {
return getGenericDao().getByField(fieldName, fieldValue);
}
/**
* By default, calls the create method but this method can
* be overrided to have a more complex business logic.
*/
@Override
@Transactional
public void create(T entity) {
if (entity.isNew()) {
getGenericDao().create(entity);
} else {
throw new EntityNotNewException("The entity is not a new entity. You should use update instead of create.");
}
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#update(T)
*/
@Override
@Transactional
public void update(T entity) {
getGenericDao().update(entity);
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#delete(T)
*/
@Override
@Transactional
public void delete(T entity) {
getGenericDao().delete(entity);
}
@Override
@Transactional
public void delete(Number id) {
T entity = getGenericDao().getById(id); // TODO exception if not found
getGenericDao().delete(entity);
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#refresh(T)
*/
@Override
public T refresh(T entity) {
return getGenericDao().refresh(entity);
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#list()
*/
@Override
public List<T> list() {
return getGenericDao().list();
}
protected List<T> listByField(String fieldName, Object fieldValue) {
return getGenericDao().listByField(fieldName, fieldValue);
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#count()
*/
@Override
public Long count() {
return getGenericDao().count();
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#evict(T)
*/
@Override
public void evict(T entity) {
getGenericDao().flush();
getGenericDao().evict(entity);
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#flush()
*/
@Override
public void flush() {
getGenericDao().flush();
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#setReadOnly(T, boolean)
*/
@Override
public void setReadOnly(T object, boolean readOnly) {
getGenericDao().setReadOnly(object, readOnly);
}
/* (non-Javadoc)
* @see com.axxx.dps.apv.persistence.GenericEntityService#clearSession()
*/
@Override
public void clearSession() {
getGenericDao().clearSession();
}
}