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){
nov 29, 2017 6:55:35 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
nov 29, 2017 6:55:35 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/sistema_escolar]
nov 29, 2017 6:55:35 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=root, password=}
nov 29, 2017 6:55:35 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
nov 29, 2017 6:55:35 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
nov 29, 2017 6:55:35 PM org.hibernate.dialect.Dialect
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
nov 29, 2017 6:55:35 PM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@4698e935] for (non-JTA) DDL execution was not in auto-commit mode; the Connection ‘local transaction’ will be committed and the Connection will be set into auto-commit mode.
usuário alterado com sucesso!!
nov 29, 2017 6:55:38 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
name: teste
…]
nov 29, 2017 6:55:38 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
nov 29, 2017 6:55:38 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/sistema_escolar]
nov 29, 2017 6:55:38 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=root, password=}
nov 29, 2017 6:55:38 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
nov 29, 2017 6:55:38 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
nov 29, 2017 6:55:38 PM org.hibernate.dialect.Dialect
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
nov 29, 2017 6:55:38 PM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@73e79996] for (non-JTA) DDL execution was not in auto-commit mode; the Connection ‘local transaction’ will be committed and the Connection will be set into auto-commit mode.
nov 29, 2017 6:55:39 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
em.getTransaction().begin();
Usuario CADASTRO_USUARIO = em.find(Usuario.class, ServletAlterarUsuario.getID());
//altera somente os campos que vieram da tela em questao
CADASTRO_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.
em.close();
System.out.println("usuário alterado com sucesso!!");
}
porém retornou o seguinte erro
GRAVE: Servlet.service() for servlet [servlet.ServletAlterarUsuario] in context with path [/SISTEMA_ESCOLAR] threw exception
java.lang.NullPointerException
at com.cleiton.consultasAtualizarDeletar.ListarUsuarios.alterardados(ListarUsuarios.java:111)
at servlet.ServletAlterarUsuario.doPost(ServletAlterarUsuario.java:61)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
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.
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