Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Salvar ou dar update de acordo com o objeto que veio no parametro

Boa tarde, estou tentando criar um método para um DAO genérico onde de acordo com o objeto que vem no parametro o metódo verifica se aquele objeto existe no banco de dados, se existir ele da merge, senão ele persiste. Estou tentando usar reflection, e ele funciona com o merge, mas quando não existe ele vai direto para a exception do catch, tive algumas idéias, mas não consegui. No momento tenho esse código abaixo, alguma dica? Obrigado.

public void save(T object){

        try {

            Field declaredField = object.getClass().getDeclaredField("id");
            declaredField.setAccessible(true);

            if(this.manager.find(clazz, declaredField.get(object)) != null){
                this.manager.merge(object);
            }else{
                this.manager.persist(object);
            }
        } catch (IllegalArgumentException e) {
            this.manager.persist(object);
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
5 respostas

Oi Mário,

Acho que para seu caso é só receber o objeto e utilizar o merge. Caso ao invés de usar o EntityManager da JPA opte pela Session do hibernate, existe o método saveOrUpdate

Bacana, mas seria possivel eu fazer uma verificação? Por exemplo se for novo ele salva, se não for ele faz outras coisas antes de dar o merge

dá uma olhada no código do deltaspike-jpa que faz exatamente a mesma coisa

não posso usar outra coisa além do hibernate =/ (não posso mexer no pom)

solução!

Não faria mais sentido você fazer isso antes de mandar para o DAO? Aí você verifica se tem o id ou não. Se de todo caso quiser ver isso em um DAO genérico, vai acabar tendo que usar reflection para pegar o atributo e ver se ele está null ou não.