Search code examples
javafacade

implement public void edit(T entity) AbstractFacade java


I´m trying to understand the facade pattern

public abstract class AbstractFacade<T> {

    private Class<T> entityClass;

    public AbstractFacade(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }

    public void edit(T entity) {
        getEntityManager().merge(entity);
    }

    public void remove(T entity) {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

    public T find(Object id) {
        return getEntityManager().find(entityClass, id);
    }

    public List<T> findAll() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return getEntityManager().createQuery(cq).getResultList();
    }

    public List<T> findRange(int[] range) {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        javax.persistence.Query q = getEntityManager().createQuery(cq);
        q.setMaxResults(range[1] - range[0] + 1);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }

    public int count() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
        cq.select(getEntityManager().getCriteriaBuilder().count(rt));
        javax.persistence.Query q = getEntityManager().createQuery(cq);
        return ((Long) q.getSingleResult()).intValue();
    }
}

using netbeans wizard, but I dont understand why send T entity to this void;

public void edit(T entity)

and no a id for this

public void edit(long id)

same for the remove method

public void remove(T entity)

and make this

public void remove(long id)

how can I implement the void Edit in my bean controller?


Solution

  • If I understand your questions correctly:

    Why send(T entity) returns void and doesn't require ID?

    Because entity passed as argument already contains ID and will overwrite entity which have the same ID in DB table

    Same for the remove(T entity) method

    Same for this. If you don't have an entity, just ID, then to remove entity by ID, you need to create new empty entity, assign ID and pass it to remove() method.

    how can I implement the void Edit in my bean controller?

    Here, you don't need to implement anything except getEntityManager() method. Kind of:

    public class MyFacade extends AbstractFacade<MyEntityClass> {
    
         @Resource
         EntityManagerFactory emf;
    
         @Override
         EntityManager getEntityManager() {
             return emf.createEntityManager();
         }
    }