Aplicação para de funcionar após erro SQLServerException

17/08/2011

0

Bom dia.   Estou desenvolvendo uma aplicação JSF 2.0 Hibernate 3, em uma tela com um DataTable após alterar alguns dados e invocar a atualização, ocorre um erro, eu sei que o erro iria ocorrer pois provoco a situação para analizar como a aplicação iria se comportar. Após este erro ocorrer a apliçação para de funcionar, e não consigo interceptar o erro no metodo que faz a atualização.   Alguem poderia me ajudar.     Segue os códigos :   Erro reportado :

25877 ["http-bio-8080"-exec-7] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 2601, SQLState: S0001
25877 ["http-bio-8080"-exec-7] ERROR org.hibernate.util.JDBCExceptionReporter - Cannot insert duplicate key row in object 'dbo.SYS_SEG_USUARIO' with unique index 'IND_USUARIO_USER_NMAE_PASSWORD'.
Aug 17, 2011 11:25:19 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [FacesServlet] in context with path [/prjGEO2] threw exception [org.hibernate.exception.SQLGrammarException: could not update: [gestaoobra.usuario.Usuario#118]] with root cause
com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert duplicate key row in object 'dbo.SYS_SEG_USUARIO' with unique index 'IND_USUARIO_USER_NMAE_PASSWORD'.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:390)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:340)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:179)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:154)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:308)
at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2590)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2494)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2821)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:113)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
at gestaoobra.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:35)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
  Filter :

public class ConexaoHibernateFilter implements Filter {
private SessionFactory sf;

@Override
public void init(FilterConfig config ) throws ServletException {
this.sf = HibernateUtil.getSeesioinFactory();
}

@Override
public void doFilter( ServletRequest servletRequest , ServletResponse serveletResponse ,
FilterChain chain ) throws ServletException {
if ( validaAcessoAPagina((HttpServletRequest) servletRequest, (HttpServletResponse) serveletResponse) ) {
try {
this.sf.getCurrentSession().beginTransaction();
chain.doFilter(servletRequest, serveletResponse);
this.sf.getCurrentSession().getTransaction().commit();
this.sf.getCurrentSession().close();
} catch (Throwable ex) {
try {
if ( this.sf.getCurrentSession().getTransaction().isActive()) {
this.sf.getCurrentSession().getTransaction().rollback();
} 
} catch (Throwable t) {
t.printStackTrace();
}
throw new ServletException(ex);
}
finally{
if ( this.sf.getCurrentSession().isOpen() ) {
this.sf.getCurrentSession().close();
}
}
}
}

@Override
public void destroy() { }

private boolean validaAcessoAPagina( HttpServletRequest req, HttpServletResponse resp ) {
OpcoesMenuRN opMenuRN = new OpcoesMenuRN();
HttpSession session = req.getSession();
String page = req.getRequestURI();
UsuarioLogado usu = (UsuarioLogado) session.getAttribute("usuario");
boolean pgValida;
String pg = page.replace("/prjGEO2/", "").replace("restrito/" ,"").replace("publico/","").replace(".jsf", "").replace(".xhtml", "").replace("/","");
System.out.println("pagina solicitada : " + page );

if ( ( ( page.indexOf("restrito") > - 1 ) || 
( page.indexOf("privado") > -1 ) ) ) {
if ( ! page.endsWith("login.jsf")) {

if ( ( page.endsWith("mainpage.jsf") ) && ( session != null ) &&
( usu != null ) && ( usu.isLogado() ) ) {
return true;
}
else {
this.sf.getCurrentSession().beginTransaction();
pgValida = opMenuRN.validaFormOpMenu(usu.getIdUsuario(), pg );
this.sf.getCurrentSession().getTransaction().commit();
this.sf.getCurrentSession().close();

if ( ! pgValida ) {
try {
session.invalidate();
resp.sendRedirect("/prjGEO2/");
return false;
}
catch (Throwable t) {
t.printStackTrace();
}
}
}


}
}

return true;
}
}
  ManagedBean :

@ManagedBean(name="cadastroUsuario")
@ViewScoped
public class CadastroUsuario implements Serializable{

private static final long serialVersionUID = 1L;
private List<Usuario> lista;
private Usuario selectedUsuario = new Usuario();
private UIPanel panelForm;



public UIPanel getPanelForm() {
return panelForm;
}

public void setPanelForm(UIPanel panelForm) {
this.panelForm = panelForm;
}

public void anulaSelcionar() {
this.selectedUsuario = new Usuario();
this.cleanSubmittedValues(this.panelForm);

}

public Usuario getSelectedUsuario() {
return this.selectedUsuario;
}

 
public void setSelectedUsuario(Usuario selectedUsuario) {
this.selectedUsuario = selectedUsuario;
}

public void onRowSelected(SelectEvent event){
Usuario usu = (Usuario) event.getObject();
}

public List<Usuario> getLista() {
if ( this.lista == null ) {
UsuarioRN usuarioRN = new UsuarioRN();
this.lista = usuarioRN.listar();
}

return this.lista;

}

public void salvar() {
try {
UsuarioRN usuarioRN = new UsuarioRN();
usuarioRN.salvar(this.selectedUsuario); 
} 
catch (Exception e) {
FacesContext fctx = FacesContext.getCurrentInstance();
FacesMessage msg = new FacesMessage("Falha durante atualização.");
fctx.addMessage(null, msg);
}
}

protected void cleanSubmittedValues(UIComponent component) { 
component.getChildren().clear(); 
} 

}
    Entity :

@Entity
@Table(name="SYS_SEG_USUARIO")
public class Usuario implements Serializable {

private static final long serialVersionUID = 983778034503133406L;

@Id
@GeneratedValue
@Column(name = "ID_USUARIO")
private Integer idUsuario;

@Column(name = "NOME_USUARIO", length = 140)
private String nomeUsuario;

@Column(name = "SIGLA_DPTO_USUARIO", length = 40)
private String siglaDpto;

@org.hibernate.annotations.NaturalId( mutable = true)
@Column(name = "USER_NAME", length = 20)
private String userName;

@org.hibernate.annotations.NaturalId( mutable = true)
@Column(name = "PASSWORD_USUARIO", length = 20)
private String passWord;

@Column(name = "EMAIL_USUARIO", length = 180)
private String eMail;

@Column(name = "DATA_CADASTRO",insertable=false, updatable=false)
private Date dtaCadastro;

@Column(name = "DATA_ALTERACAO",insertable=false, updatable=false)
private Date dtaAlteracao;

@ManyToOne
@JoinColumn(name="ID_EMPRESA")
private Empresa empresa;

@OneToOne(mappedBy="usuariooo", cascade=CascadeType.ALL)
@JoinColumn(name="ID_USUARIO", insertable = true, updatable = false) 
private UsuarioPerfil usuarioPerfil;

public Empresa getEmpresa() {
return empresa;
}
get e sets
    Obrigado.  
Dalton Boer

Dalton Boer

Responder

Posts

17/08/2011

Robson Teixeira

revise a sua tabela pois pelo que está na exception você está tentando fazer um insert onde o valor da primary key ja existe na tabela   note o que esta na exception [org.hibernate.exception.SQLGrammarException: could not update: [gestaoobra.usuario.Usuario#118]] with root cause com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert duplicate key row in object 'dbo.SYS_SEG_USUARIO' with unique index 'IND_USUARIO_USER_NMAE_PASSWORD'.
Responder

17/08/2011

Davi Costa

Que tal colocar uma estratégia de autoincremento na sua entidade:

@Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "ID_USUARIO") private Integer idUsuario;
Att Davi

Responder

17/08/2011

Dalton Boer

Davi,       O problema não está no momento de inserção de dados e sim qdo faço atualização, se eu forçar uma situação em que ocorra um erro de update, o uso de Open Session in View por meio do Filtro, não me permite tratar o erro e a aplicação fica travada, pelo que me parece a sessão que foi fechada não mais é reiniciada. e após ser feito o Rollback na transação é lançado um ServletException.        Mas de qquer forma obrigado pelo conselho.   Tks.  
Responder

17/08/2011

Dyego Carmo

Você está duplicando uma chave , o indice do banco de dados não está permitindo , verificou se este indice está correto ?
Responder

17/08/2011

Dalton Boer

 O problema está justamente em interceptar e tratar o erro no Filtro, e mostear o erro ocorrido na página e permitir que a aplicação continue funcionando.     Usando Open Session in View eu não consigo tratar o erro, apresenta-lo na página e a aplicação continuar funcionando.  
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