[RESOLVIDO] Problema para excluir registro com campo unique

3 respostas
C

Pessoal, estou com o seguinte problema:

Tenho uma tabela Pessoa que é superclasse de outra tabela chamada Cooperado. O atributo cpf é setado como único. Quando tento uma inserção de um registo/objeto com cpf idêntigo a um cpf já inserido, funciona corretamente, não permitindo a inserção. Entretanto, após isso, caso eu tente excluir no meu datatable o registro com que possui tal cpf, é lançada exceção, não perimitindo que eu exclua o registro. Aí é necessário reiniciar o Tomcat para poder conseguir excluir. Alguém consegue me ajudar ?

Abraços!

@MappedSuperclass
public abstract class Pessoa {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;
	private String nome;
	private String email;
	private String telefone;
	private String celular;
	private String fax;
	@Column(unique=true)
	private String cpf;

3 Respostas

caio.gaspar

Qual a exceção que esta sendo lançada?

C

caio, está sendo lançada a seguinte exceção:

javax.persistence.RollbackException: Error while committing the transaction at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:93) at br.com.clayton.cooperativa.mb.CooperadoBean.remove(CooperadoBean.java:103) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.el.parser.AstValue.invoke(AstValue.java:262) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIData.broadcast(UIData.java:912) at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:630) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) 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:498) 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:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 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) Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:81) ... 38 more Caused by: org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109) at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2648) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2893) at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97) 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:189) 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 org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76) ... 38 more Caused by: java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020) at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) ... 53 more

C

Consegui resolver pessoal.

Coloquei uma linha para dar rollback no bloco try/catch. A princípio, parece que era problema de concorrência, quando tentava remover o registro que possuia o cpf igual ao outro registro que tentara adicionar. O registro ficava em lock, pois a primeira transação para adicionar nao era terminada com o commit.

public String grava() throws Exception  {

		EntityManager em = new JPAUtil().getEntityManager();
		CooperadoDAO dao = new CooperadoDAO(em);
		try {
			em.getTransaction().begin();
			if (cooperado.getId() == null) {
				dao.adiciona(this.cooperado);
			} else {

				dao.atualiza(this.cooperado);
			}
			em.getTransaction().commit();

			FacesContext.getCurrentInstance().addMessage(
					"formCadastraCooperado",
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"O cooperado salvo com sucesso!", " "));
		} catch (Exception e) {
			em.getTransaction().rollback();
			FacesContext
					.getCurrentInstance()
					.addMessage(
							"formCadastraCooperado",
							new FacesMessage(FacesMessage.SEVERITY_ERROR,
									"O cooperado não foi salvo.",
									"Já existe um cooperado com o mesmo CPF já cadastrado!"));
			throw e; 

		} finally {
			em.close();
		}

		this.carregaCooperados();
		return "cooperado?faces-redirect=true";

	}
Criado 19 de abril de 2011
Ultima resposta 20 de abr. de 2011
Respostas 3
Participantes 2