entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

implementar metodo editar o remover en patron facade

hola! Estoy tratando de entender el patrón de fachada utilizando el asistente netbeans, pero no entiendo por qué enviar T entidad a este void; public void edición (T entidad) y sin una id o pk como se usa en este metodo

public void edición (long id)

lo mismo para el método remove
public void remove (T entidad)
public void remove (long id)

en la clase facade esta:

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();
}

}

lo ideal es encontrar el id con find(object id) y luego tomar la entidad y ejecutar el metodo edit(T entity)
alguien sabe o tiene un codigo para esta accion???

2 Respuestas

0voto

german Puntos1770

la respuesta fue bastante sencilla... si, es estoy aprendiendo... conozco o entiendo el entity manager, siempre he dicho que java son los pioneros y que le sigue c# (que es el lenguaje que mas manejo)

la respuesta era tornar la entidad con el metodo find en mi regla de negocio

    public Persona PersonaFind(Long codigoPersona){
         Persona xpersona = personaDao.find(codigoPersona);
    return xbalota;

en el anterior codigo con el metodo find traigo toda la entidad y ya con

public String guardarPersona(){
    try {
     personaRN.Persona(xPersona)
         return "index";
 } catch (Exception e) {
        System.out.println("Error "+e);
        return "index";
    }

claro esta a tomando de la clase generica los metodos y llamando desde una clase facade el entity manager

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

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

-1voto

Javi2EE Puntos6630

Hola Germán mira por tu pregunta veo que no entiendes completamente el funcionamiento del entinty manager.
Cuando tu invocas al método edit(T entinty) se invoca directamente merge( T entity ), esta función actualiza la versión de entinty en la base de datos en caso de que exista, si no existe crea un nuevo registro, no tiene sentido pasar edit( long id) ya que sólo le estarías indicando la id del objeto que quieres editar pero no le estarías dando los valores que quieres que tome ese objeto.
Por otro lado internamente el método merge ya se encarga de buscar la entidad que le pasas y lo hace mediante su @Id si ya existe un registro en la bbdd con ese id lo actualiza , si no existe ningún objeto con esa id crea uno nuevo, así que lo que preguntas aquí:

lo ideal es encontrar el id con find(object id) y luego tomar la entidad y ejecutar el metodo edit(T entity)
alguien sabe o tiene un codigo para esta accion???

Eso es justamente lo que ya hace merge por sí solo ;)

Este es un tema bastante extenso que deberías comprender muy bien antes de intentar hacer nada para evitarte muchísimos dolores de cabeza, ya que además de lo que te he comentado entran en juego otros factores como la cache si utilizas JPA y en un momento dado puedes tener en la misma aplicación hasta tres versiones diferentes de un mismo objeto. Te pasó un enlace que a lo mejor te ayuda
Entity manager y persistenceContext

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta