Tem como saber qual o atributo da classe para informar o usuário ao pegar uma ConstraintViolationException ? [Resolvido]

3 respostas
java
vpmaciel1981
package erp.banco;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PersistenceContext;

import erp.usuario.Usuario;

@SuppressWarnings("serial")
@PersistenceContext(unitName = "erp")
@Entity
public class Banco implements Serializable {

	@Column(unique = true, length = 10, nullable = true)
	private String codigo;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Column(unique = true, length = 50, nullable = false)
	private String nome;
	private Usuario usuarioOperacao;

	public String getCodigo() {
		return this.codigo;
	}

	public Long getId() {
		return this.id;
	}

	public String getNome() {
		return this.nome;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	@Override
	public String toString() {
		return this.nome;
	}
}
/****************************************************************************************/
	@Override
	public void salvarRegistro(Banco banco) {
		EntityManager entityManager = JPA.getEntityManagerFactory().createEntityManager();
		EntityTransaction entityTransaction = entityManager.getTransaction();
		try {
			entityTransaction.begin();
			entityManager.merge(banco);
			entityTransaction.commit();
		} catch (PersistenceException p) {
			if (p.getMessage().contains("ConstraintViolationException")) {
				if (p.getMessage().contains("nome")) { // Tem como saber que foi esse o atributo da excessão ?
					Msg.avisoCampoDuplicado("NOME");
				} else if (p.getMessage().contains("codigo")) { // Tem como saber que foi esse o atributo da excessão ?
					Msg.avisoCampoDuplicado("CÓDIGO");
				} else {
					Msg.avisoCampoDuplicado();
				}
			}
			p.printStackTrace();
			entityTransaction.rollback();
			throw p;
		}catch (Exception e) {
			e.printStackTrace();
			entityTransaction.rollback();
		} finally {
			entityManager.close();
		}
	}
// o código funciona só não pega qual o atributo da classe gerou a exceção ConstraintViolationException

3 Respostas

vpmaciel1981

O código até que está capturando a exceção corretamente, o que eu quero saber é se tem como pegar se foi o nome do Banco que está duplicado ao cadastrar ou se foi o código do banco que está duplicado ao cadastrar ?

vpmaciel1981
package erp.banco;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.PersistenceContext;
import javax.persistence.Table;

import erp.usuario.Usuario;

@SuppressWarnings("serial")
@PersistenceContext(unitName = "erp")
@Entity
@Table(indexes = { @Index(name = "INDEX_NOME", columnList = "nome", unique = true),
		@Index(name = "INDEX_CODIGO", columnList = "codigo", unique = true) })
public class Banco implements Serializable {

	@Column(length = 10, nullable = true)
	private String codigo;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Column(length = 50, nullable = false)
	private String nome;

	public String getCodigo() {
		return this.codigo;
	}

	public Long getId() {
		return this.id;
	}

	public String getNome() {
		return this.nome;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	@Override
	public String toString() {
		return this.nome;
	}
}

/***********************************************************************************/

	@Override
	public void salvarRegistro(Banco banco) {

		EntityManager entityManager = JPA.getEntityManagerFactory().createEntityManager();
		EntityTransaction entityTransaction = entityManager.getTransaction();
		try {
			entityTransaction.begin();
			entityManager.merge(banco);
			entityTransaction.commit();
		} catch (Exception e) {
			Throwable throwable = e.getCause().getCause();
			String mensagem = throwable.toString();
			if (mensagem.contains("ConstraintViolationException")) {
				if (mensagem.contains("INDEX_NOME")) {
					Msg.avisoCampoDuplicado("NOME");
				} else if (mensagem.contains("INDEX_CODIGO")) {
					Msg.avisoCampoDuplicado("CÓDIGO");
				} else {
					Msg.avisoCampoDuplicado();
				}
			}
			e.printStackTrace();
			entityTransaction.rollback();
			throw e;
		} finally {
			entityManager.close();
		}
	}
vpmaciel1981

Resolvido.

Criado 11 de maio de 2019
Ultima resposta 11 de mai. de 2019
Respostas 3
Participantes 1