gente não sei se é a forma mais rápida e fácil de fazer. porém o problema é o seguinte
estou tentando realizar um update ,porém o método está inserindo no banco.
vou deixar o código abaixo para vocês observarem o que estou fazendo de errado
public void alterardados(Usuario ServletAlterarUsuario){
EntityManagerFactoryemf=Persistence.createEntityManagerFactory("teste");EntityManagerem=emf.createEntityManager();UsuarioCADASTRO_USUARIO=newUsuario();CADASTRO_USUARIO.setUSR_NOME(ServletAlterarUsuario.getUSR_NOME());CADASTRO_USUARIO.setUSR_CPF(ServletAlterarUsuario.getUSR_CPF());CADASTRO_USUARIO.setUSR_EMAIL(ServletAlterarUsuario.getUSR_EMAIL());CADASTRO_USUARIO.setUSR_SENHA(ServletAlterarUsuario.getUSR_SENHA());CADASTRO_USUARIO.setUSR_TELEFONE(ServletAlterarUsuario.getUSR_TELEFONE());CADASTRO_USUARIO.setUSR_CELULAR(ServletAlterarUsuario.getUSR_CELULAR());CADASTRO_USUARIO.setUSR_CEP(ServletAlterarUsuario.getUSR_CEP());CADASTRO_USUARIO.setUSR_NUMERO(ServletAlterarUsuario.getUSR_NUMERO());CADASTRO_USUARIO.setUSR_LOGRADOURO(ServletAlterarUsuario.getUSR_LOGRADOURO());CADASTRO_USUARIO.setUSR_BAIRRO(ServletAlterarUsuario.getUSR_BAIRRO());CADASTRO_USUARIO.setUSR_LOCALIDADE(ServletAlterarUsuario.getUSR_LOCALIDADE());CADASTRO_USUARIO.setUSR_ESTADO(ServletAlterarUsuario.getUSR_ESTADO());em.getTransaction().begin();em.merge(CADASTRO_USUARIO);em.getTransaction().commit();em.close();System.out.println("usuário alterado com sucesso!!");
Se quer fazer update dessa forma com JPA/Hibernate terá que carregar o objeto do banco antes e não criar um objeto do zero (new).
C
Cleiton_Conceicao1
você poderia fazer um exemplo para poder eu entender melhor?
staroski
em.persist(ServletAlterarUsuario);
Simples assim.
C
Cleiton_Conceicao1
não estou em casa agora.
mas no caso eu teria que trocar o
Usuario CADASTRO_USUARIO = new Usuario();
por
em.persist(ServletAlterarUsuario);
?
me desculpa a burrice. é pq ainda tenho 2 telas pra fazer e o trabalho é pra entregar sexta.
Cleiton_Conceicao
eu achei q não entendi direito. fiz essas mudanças e não deu certo.
javaflex
Tem várias formas. A forma mais sob controle:
em.getTransaction().begin();UsuarioCADASTRO_USUARIO=em.find(Usuario.class,ServletAlterarUsuario.getID());//altera somente os campos que vieram da tela em questaoCADASTRO_USUARIO.setUSR_NOME(ServletAlterarUsuario.getUSR_NOME());CADASTRO_USUARIO.setUSR_CPF(ServletAlterarUsuario.getUSR_CPF());//etc..em.getTransaction().commit();
Se você quer fazer atualizar um registro na base, não faz sentido instanciar outro objeto setando as mesmas propriedades.
Você já recebe o Usuario alterado por parâmetro, é só fazer o persist dele.
Cleiton_Conceicao
eu fiz isso.
public void alterardados(Usuario ServletAlterarUsuario){
Debuga pra saber exatamente onde está null. Aponta qual linha exata e qual objeto está null.
javaflex
Se mandar atualizar direto através do objeto que vem da requisição, funcionar vai, mas tem o perigo de sujar informações que não sejam atualizáveis por essa tela. Pode não ser o caso no momento, mas o sistema vira um campo minado. Assim como a preguiça do SELECT asterisco.
O ideal mesmo seria fazer update em SQL com os campos necessários pra funcionalidade em questão, mas pra turma que foge de SQL, HQL seria a saída mais eficiente e sob controle.
J
jrxxjr
Sei que é meio antigo esse post, mas acho que posso ajudar.
Execute o comando find antes da transação, fora da transação.
Execute um print do conteúdo do objeto CADASTRO_USUARIO carregado, para saber se a propriedade id que está referenciada na classe/entidade está preenchida, se ela estiver vazia, será criado um novo registro.
Fiz um tutorial sobre JPA, ele é simples, por favor, veja se ajuda.
Seguem os links: http://www.tidicas.com.br/?p=1864 http://www.tidicas.com.br/?p=130 http://www.tidicas.com.br/?p=319