Fundeweb 2.x utiliza el patrón MVC (Modelo, Vista, Controlador) separando el código en tres capas:


Fundeweb 2.x incluye una clase genérica para el acceso a base de datos que ya provee muchos métodos útiles aparte de los típicos de un servicio CRUD (Create, Read, Update, Delete), como pueden ser consultas paginadas, consultas a partir de entidades Java, filtrado dinámico, etc. Todos los métodos implementados proveen su propio Javadoc para que sepamos cómo invocarlos fácilmente.

A continuación mostramos el diagrama de clases:


public interface DataAccessService<T> {
 
	T newInstance();
 
	void persist(T entity);
 
	void persist(T entity, boolean flush);
 
	T persist(T entity, boolean flush, boolean refresh);
 
	void refresh(T entity);
 
	T find(Object id);
 
	void deleteById(Object id);
 
	void deleteById(Object id, boolean flush);
 
	void delete(T entity);
 
	void delete(T entity, boolean flush);
 
	void deleteEntities(T[] entities);
 
	void deleteEntities(T[] entities, boolean flush);
 
	T update(T entity);
 
	T update(T entity, boolean flush);
 
	boolean isManagedEntity(T entity);
 
	T merge(T entity);
 
	T merge(T entity, boolean flush);
 
	void flush();
 
}



@Local(AnuncioDataAccessService.class)
@Stateless
public class AnuncioDataAccessServiceImpl extends DataAccessServiceImpl<Anuncio>
		implements AnuncioDataAccessService {
 
  private static final String[] RESTRICTIONS_ANUNCIO = {	 
    UtilString.cmpNumberTextFilterEjbql("entity.id", ":anuncioId"),
    UtilString.cmpTextFilterEjbql("entity.nombre", ":anuncioNombre"),
    UtilString.cmpTextFilterEjbql("entity.descripcion", ":anuncioDescripcion"),
    UtilString.cmpDateTextFilterEjbql("entity.fechaPublicacion", ":anuncioFechaPublicacion"),
  };
 
  public ResultQuery<Anuncio> obtenerAnuncios(Map<String, Object> parameters, int firstResult, int resultLimit, String sortField, String sortOrder) {
    return super.resultsByEntityQueryWithDinamicFilter(Arrays.asList(RESTRICTIONS_ANUNCIO), parameters,
                                                       firstResult, resultLimit, sortField, sortOrder, null, null);
   }	
}