Merge inserindo um novo registro

19/05/2010

0

Pessoal, tudo blz, é o seguinte, possuo algumas tabelas q suas chaves são atribuidas manualmente (eu sei q não é legal, mas é necessário), o problema é q quando mudo a chave e mando atualizar através do merge, ele faz é inserir um novo registro com os dados, o q eu posso fazer pra isso não acontecer? Obrigado
José Filho

José Filho

Responder

Posts

20/05/2010

Angelo Santos

Olá fajo,

Quando vc altera a chave de um registro , o "merge" entende como um novo registro.

Tenta usar o update().

Até.
Responder

20/05/2010

José Filho

Oi Angelo, blz cara,

bom, é o seguinte, o meu salvar tá assim:

        if (novoRegistro == true) {
            empresaDao.salvar(empresa);
            FacesUtils.mensErro("Registro Salvo com Sucesso!");
        } else {
            empresaDao.atualizar(empresa);
            FacesUtils.mensErro("Registro Atualizado com Sucesso!");
        }

        return "sucesso";


e o atualizar:

[CODE[
    @Transactional(readOnly=false,propagation=Propagation.REQUIRED)
    public T atualizar(T object) {
        getEntityManager().merge(object);
        return object;
    }

[/CODE]

esqueci de mencionar q estou usando Spring, JPA.
Responder

20/05/2010

José Filho

  Oi Angelo, blz cara,

bom, é o seguinte, o meu salvar tá assim:


        if (novoRegistro == true) {

            empresaDao.salvar(empresa);

            FacesUtils.mensErro("Registro Salvo com Sucesso!");

        } else {

            empresaDao.atualizar(empresa);

            FacesUtils.mensErro("Registro Atualizado com Sucesso!");

        }



        return "sucesso";



e o atualizar:

[CODE[
    @Transactional(readOnly=false,propagation=Propagation.REQUIRED)
    public T atualizar(T object) {
        getEntityManager().merge(object);
        return object;
    }

[/CODE]

esqueci de mencionar q estou usando Spring, JPA.
Responder

20/05/2010

José Filho

Desculpe ter colocado 2 vezes, é q na 1ª tava aparecendo um erro estranho de asp, pensei q era o navegador, mas abri em outra e a mesma mensagem de erro era mostrada ai respondi de novo, então apareceu a anterior correta, super estranho.
Responder

22/05/2010

Dyego Carmo

Realmente , voce nao vai conseguir fazer isto...


utilize o comando UPDATE mesmo... (o JPA suporta o comando UPDATE)


Trocar chaves de tabela alem de nao ser comum não é algo indicado..
Responder

24/05/2010

José Filho

Dyego, tentei fazer o q vc disse, trocar o merge por update, mas não deu certo:

    @Transactional(readOnly=false,propagation=Propagation.REQUIRED)
    public T atualizar(T object) {
        getEntityManager().update(object);
        return object;
    }


The method update(T) is undefined for the type EntityManager.

E agora?
Responder

25/05/2010

Dyego Carmo

troque:

public T atualizar(T object) {
        getEntityManager().update(object);
        return object;
    }

para:

public <T> T atualizar(T object) {
        getEntityManager().update(object);
        return object;
    }



e teste

Responder

26/05/2010

José Filho

Dyego, quando coloquei o q vc disse deu erro, vou colocar a classe toda:

@Transactional(readOnly=true,propagation=Propagation.REQUIRED)
public class DaoGenericoImp<T,ID extends Serializable> implements DaoGenerico<T, ID> {

    private EntityManager entityManager;
    
    private final Class<T> oClass;
    
    @SuppressWarnings("unchecked")
    public DaoGenericoImp(){
        this.oClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
    
    @Override
    @Transactional(readOnly=false,propagation=Propagation.REQUIRED)
    public <T> T atualizar(T object) {
        getEntityManager().update(object);
        return object;
    }     @Override     @Transactional(readOnly=false,propagation=Propagation.REQUIRED)     public void excluir(T object) {         object = getEntityManager().merge(object);         getEntityManager().remove(object);     }     @Override     public Class<T> getObjectClass() {         return this.oClass;     }     @SuppressWarnings("unchecked")     @Override     public List<T> listPesq(String query) {         Query q = getEntityManager().createQuery(query);         return q.getResultList();     }     @SuppressWarnings("unchecked")     @Override     public List<T> listPesqParam(String query, Map<String, Object> params) {         Query q = getEntityManager().createQuery(query);         for(String chave:params.keySet()){             q.setParameter(chave, params.get(chave));         }         return q.getResultList();     }     @SuppressWarnings("unchecked")     @Override     public List<T> listPesqParam(String query, Map<String, Object> params,             int maximo, int atual) {         Query q = getEntityManager().createQuery(query).setMaxResults(maximo).setFirstResult(atual);         for(String chave:params.keySet()){             q.setParameter(chave, params.get(chave));         }         return q.getResultList();     }     @SuppressWarnings("unchecked")     @Override     public T pesqParam(String query, Map<String, Object> params) {         Query q = getEntityManager().createQuery(query);                 for(String chave : params.keySet()){             q.setParameter(chave, params.get(chave));         }                 try{             return (T)q.getSingleResult();         }catch(NoResultException nre){             return null;         }     }     @Override     public T pesquisarPorId(ID id) {         return (T)getEntityManager().find(oClass, id);     }     @Override     @Transactional(readOnly=false,propagation=Propagation.REQUIRED)     public T salvar(T object) {         getEntityManager().clear();         getEntityManager().persist(object);         return object;     }     @SuppressWarnings("unchecked")     @Override     public List<T> todos() {         String queryS = "SELECT obj FROM "+oClass.getSimpleName();         Query query = getEntityManager().createQuery(queryS);         return query.getResultList();     }     @SuppressWarnings("unchecked")     @Override     public List<T> todos(int ordem) {         String queryS = "SELECT obj FROM "+oClass.getSimpleName()+" obj ORDER BY "+ordem;         Query query = getEntityManager().createQuery(queryS);         return query.getResultList();     }         @PersistenceContext     public void setEntityManager(EntityManager em) {         this.entityManager = em;     }     public EntityManager getEntityManager() {         if (entityManager == null)              throw new IllegalStateException("Erro");         return entityManager;     } }


e o erro:

Multiple markers at this line
    - The method atualizar(T) of type DaoGenericoImp<T,ID> must override or implement a supertype method
    - Name clash: The method atualizar(T) of type DaoGenericoImp<T,ID> has the same erasure as atualizar(T) of type DaoGenerico<T,ID> but does not 
     override it
    - The type parameter T is hiding the type T

Responder

03/06/2010

Dyego Carmo

Voce não esta repetindo os SUPERCAT METHODS ?

Responder

03/06/2010

José Filho

Só entendi a parte do repetindo, hehehe, não entendi o q são os SUPERCAT METHODS.   Mas não, não repeti nenhum metodo de salvamento.
Responder

28/08/2010

Carlos Mazzi

Dyego, tbm desconheco esse termo SUPERCAT method...o que é?
Responder

06/09/2010

Dyego Carmo

Troque:

public <T> T atualizar(T object) {
        getEntityManager().update(object);
        return object;
    }



por:



public <T> T atualizar(T object) {
        return  getEntityManager().update(object);
    }



e teste por favor :)

SUPERCAT METHODS = Uma implementação de superclasse.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar